一、Mybatis的映射器

1.1 Mybatis框架包含两种类型的xml文件,一类是配置文件,即mybatis-config.xml,另一类配置文件,例如XXXMapper.xml等。在mybatis的配置文件mybatis-config.xml中包含了<mappers></mappers>节点,这就是Mybatis的映射器。

1.2 Mybatis映射器分类

(1)纯xml映射器,利用sqlSession的各个方法实现增删改查功能。

<select id="selectStudentById" parameterType="int" resultType="student">
    select id,name,sex,age from student where id=#{id}
</select>
Student student = session.selectOne("com.asiainfo.mapper.StudentMapper.selectStudentById", 1);

(2)xml映射器+接口映射器的混合类型

先定义接口映射器,再定义xml映射器,中xml映射器中的namespace对应类接口的全限定名,xml中的id属性值对应类接口的方法名。用法如下:

import com.asiainfo.pojo.Student;

public interface StudentMapper {
    public Student selectStudentById(Integer id);
}
<mapper namespace="com.asiainfo.mapper.StudentMapper">
    <select id="selectStudentById" parameterType="int" resultType="student">
        select id,name,sex,age from student where id=#{id}
    </select>
</mapper>
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        Student student = studentMapper.selectStudentById(1);

(3)注解+接口映射器的混合类型

此类形式将原先xml中sql配置信息,变成java注解的形式写到接口映射器中,用法与上面的雷同。

1.3 映射器三种引入方式

(1)通过文件类路径引入xml映射器

<mappers>
    <mapper resource="com/asiainfo/mapper/StudentMapper.xml"/>
</mappers>
(2)通过包名引入映射器接口
<mappers>
    <package name="com.asiainfo.mapper"/>
</mappers>
(3)通过类注册引入映射器接口
<mappers>
    <mapper class="com.asiainfo.mapper.StudentMapper" />
</mappers>

1.4 准备工作

先用以下sql建表

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(18) DEFAULT NULL,
  `sex` varchar(18) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

然后定义POJO类

package com.asiainfo.pojo;

public class Student {
    private int id;
    private String name;
    private String sex;
    private int age;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
    }
}

建接口映射器+XML映射器

package com.asiainfo.mapper;

import com.asiainfo.pojo.Student;

public interface StudentMapper {
    public Student selectStudentById(Integer id);
}

注意事项:映射器只是一个接口,而不是实现类 。初学者可能有一个疑惑,接口不是不能运行吗?的确,接口确实不能运行,但是Mybatis内部通过动态代理技术生成接口实现类,从而完成接口的相关功能。只需要明白Mybatis会为这个接口生成一个代理对象,代理对象去处理映射器接口相关的的逻辑即可。

然后创建XML映射器,如下示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.asiainfo.mapper.StudentMapper">
    <select id="selectStudentById" parameterType="int" resultType="student">
        select id,name,sex,age from student where id=#{id}
    </select>
</mapper>

有了以上两个文件,就完成了映射器的定义。

<mapper>元素中的namespace属性对应一个接口的全限定名,于是Mybatis上下文就可以通过它找到一个接口。

<select>元素表面这是一个查询的sql语句,id属性对应接口中的一个方法,parameterType=”int”,表示请求的参数是一个int类型的参数,resultType=”student”,表示返回的是一个Student类型的返回值。这里的student是mybatis.xml文件中配置的别名,指代的是com.asiainfo.pojo.Student。这里的#{id}表示传递过去的参数。

注意事项:我们并没有配置SQL执行后和student的对应关系,它是如何映射的呢,这里采用的是自动映射的功能,Mybatis默认提供自动映射,主要SQL返回的列名和POJO属性对应起来即可。

最后,在Mybatis的配置文件中引入这个XML映射器文件:

<mappers>
    <mapper resource="com/asiainfo/mapper/StudentMapper.xml"/>
</mappers>

1.5 接口绑定

接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法,可以有更加灵活的选择和设置。

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @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接口的类路径。

1.6 注解+映射器

除了使用XML定义映射器以外,还可以使用注解的方式定义,只需通过Mybatis的注解来注入SQL,如下所示:

import org.apache.ibatis.annotations.Select;

import com.asiainfo.pojo.Student;

public interface StudentMapper {
    @Select("select id,name,sex,age from student where id=#{id}")
    public Student selectStudentById(Integer id);
}

注解的方式完全等同于XML定义的方式,但注解的方式比XML方式要简单的多。如果注解方式和XML方式同时定义,XML方式会覆盖注解的方式,官方推荐使用XML方式,因为XML映射器可以完成更复杂的SQL功能。

1.7 映射器的使用有两种方式,一种是使用SqlSession的方法直接进行数据库操作,还有一种是使用SqlSession获取映射器Mapper,利用映射器执行数据库的操作,如下所示:

InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
// 操作数据库方式一:获取XML映射文件中定义的操作语句
Student student = session.selectOne("com.asiainfo.mapper.StudentMapper.selectStudentById", 1);
// 操作数据库方式二:获取mapper接口的代理对象
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
// 调用接口的方法查询数据
Student student = studentMapper.selectStudentById(1);
System.out.println(student);
session.commit();
session.close();