一、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>
<mappers> <package name="com.asiainfo.mapper"/> </mappers>
<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();