MyBatis学习之映射器Mapper(接口映射器+xml映射文件)

Table of Contents

 

01 MyBatis映射器:

1.1 接口映射器+xml映射器

1.2 接口映射器+注解

02 接口映射器+xml映射器  方式

2.1 mybatis配置文件 引入映射器:

2.2 XML映射文件 的几个顶级元素:

2.2.1 select元素 以及Select 元素的属性

2.2.2 insert, update 和 delete元素

2.2.3 sql代码段(可复用)

03 简单demo:

3.1 创建数据库:

3.2 mybatis配置文件:mybatisConfig.xml

3.3 实体类User.java:

3.4 持久层接口IUserDao.java:

3.5 对应的XML映射文件:

3.6 编写测试类DemoTest.java:

3.7 运行结果:

04 小结:


01 MyBatis映射器:

映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持XML映射器,所有的SQL语句都必须在XML文件中配置。而从MyBatis 3开始,开始支持接口映射器,其底层利用的是接口绑定技术。另外,接口映射器允许通过注解定义SQL语句,用以替代XML文件配置SQL。

  • 1.1 接口映射器+xml映射器

先定义接口映射器,然后再定义xml映射器,其中xml映射器的namespace应该对应接口映射器的类名。

  • 1.2 接口映射器+注解

此类形式,将原先xml里面的sql配置信息,变成Java注解的形式写到接口映射器

这里先记录 接口映射器+xml映射文件,后面才写 接口映射器+注解 的笔记

02 接口映射器+xml映射器  方式

2.1 mybatis配置文件 引入映射器:

在MyBatis配置文件中包含了节点,这里就是MyBatis映射器。

  • 接口映射器+xml映射器  方式时,在mybatis配置文件中引入映射器  代码如下 :

 

注意:此种⽅法要求mapper接⼝名称和mapper映射⽂件名称相同,且放在同⼀个⽬录中

 

MyBatis学习之映射器Mapper(接口映射器+xml映射文件)_第1张图片

 

2.2 XML映射文件 的几个顶级元素:

SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

  • cache – 给定命名空间的缓存配置。
  • cache-ref – 其他命名空间缓存配置的引用。
  • resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
  • sql – 可被其他语句引用的可重用语句块。
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

2.2.1 select元素 以及Select 元素的属性

select 元素允许你配置很多属性来配置每条语句的作用细节。


        SELECT id,name,address FROM Student WHERE id =#{id}
    
  • namespace是对应接口的全限定名,于是 MyBatis 上下文就可以通过它找到对应的接口。
  • select , from some_table t1 cross join some_table t2

    refid="userColumns" 对应sql中的id

     

    03 简单demo:

    3.1 创建数据库:

    MyBatis学习之映射器Mapper(接口映射器+xml映射文件)_第2张图片

    3.2 mybatis配置文件:mybatisConfig.xml

    
    
    
        
        
            
            
                
                
                
                
                    
                    
                    
                    
                    
                
            
        
    
        
    
            
        
    
    

    3.3 实体类User.java:

    public class User {
        private int id;
        private String username;
        private String sex;
        private String address;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" +id+
                    ",username=" +username+
                    ",sex=" +sex+
                    "address=" +address+
                    "}";
        }
    }

    3.4 持久层接口IUserDao.java:

    public interface IUserDao {
        /**
         * 查找所有用户
         * @return
         */
        public List findAllUser();
    }
    

    3.5 对应的XML映射文件:

    
    
    
    
        
    

    注意:此种⽅法要求mapper接⼝名称和mapper映射⽂件名称相同,且放在同⼀个⽬录中

    还有,这里个人喜欢叫Dao命名,而不是Mapper,看个人爱好

    只要,接⼝名称和映射  ⽂件名称相同,且放在同⼀个⽬录中即可

    MyBatis学习之映射器Mapper(接口映射器+xml映射文件)_第3张图片

    3.6 编写测试类DemoTest.java:

    public class DemoTest {
        InputStream inputStream;
        SqlSession session;
        SqlSessionFactory sqlSessionFactory;
        @Before
        public void init() throws IOException {
            //1.读取配置⽂件
            inputStream = Resources.getResourceAsStream("mybatisConfig.xml");
            //2.创建SqlSessionFactory的构建者对象,使⽤构建者创建⼯⼚对象SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //3.使⽤SqlSessionFactory⽣产SqlSession对象
            session = sqlSessionFactory.openSession();
        }
        @After
        public void destroy() throws IOException{
            //6.释放资源
            session.close();
            inputStream.close();
        }
        @Test
        public void test() throws IOException {
            //4.使⽤SqlSession创建dao接⼝的代理对象
            IUserDao userDao = session.getMapper(IUserDao.class);
            //5.使⽤代理对象执⾏查询所有⽅法
            List users = userDao.findAllUser();
            for (User user : users){
                System.out.println(user);
            }
        }
    }

     @Before、@After、@Test是Junit的注解,@Before是运行前指定执行的方法是public void init(),@After类似

    3.7 运行结果:

    04 小结:

    1.映射器只是一个接口,而不是一个实现类。初学者可能会产生一个很大的疑问:接口不是不能运行吗?的确,接口不能直接运行,但是MyBatis内部运用了动态代理技术,生成接口的实现类,从而完成接口的相关功能。只要明白 MyBatis 会为这个接口生成一个代理对象,代理对象会去处理映射器接口相关的逻辑即可。

    然后调用mybatis对象SQLSession的getMapper()获取代理对象,调用接口的方法

    2.我们并没有配置 SQL 执行后和 User 的对应关系,它是如何映射的呢?其实,这里采用的是一种被称为自动映射的功能,MyBatis在默认情况下提供自动映射,只要SQL返回的列名能和POJO的属性对应起来即可。

    后面会讲到当 实体类属性 和 数据库列名 不一一相同 如何 做映射

     3.接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以。

    接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。

    当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定。

    一般情况下,用xml绑定的比较多。

    使用MyBatis的mapper接口调用时要注意的事项有:

    (1)Mapper接口方法名和mapper.xml中定义的每个sql的id相同;

    (2)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;

    (3)Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;

    (4)Mapper.xml文件中的namespace即是mapper接口的类路径。

你可能感兴趣的:(J2EE实训学习,mybatis,映射器)