MyBatis映射文件详解、分页插件

本文最后更新于:1 年前

mapper文件相当于 DAO 接口的”实现类“,作用是读取 xml 文件中的标签配置封装到 Java 对象中。

PageHelper是一个独立于MyBatis框架之外的第三方分页插件。

Mapper初始化

读取xml文件中的标签配置封装到Java对象中

常用配置项

mapper根标签

mapper文件相当于DAO接口的 ”实现类“,namespace属性要指定要 “实现” 的DAO接口的全限定名。

insert标签

声明添加操作,即 sql 中的 insert 语句。

常用属性

  • id属性:绑定对应DAO接口中的方法。

  • parameterType属性:用以指定接口中对应方法的参数类型(可省略)。

  • useGeneratedKeys属性: 设置添加操作是否需要回填生成的主键

  • keyProperty属性:指定回填的id值设置给参数对象的哪个属性。

  • timeout属性:设置此操作的超时时间,如果不设置则一直等待。

主键回填

方式一
方式二

delete标签

声明删除操作。

update标签

声明修改操作。

select标签

声明查询操作。

常用属性

  • id属性: 指定要绑定的对应DAO接口中的方法。

  • parameterType属性:设置参数类型。

  • resultType属性:指定当前sql要返回的数据封装的对象的类型(实体类)。

  • resultMap属性:指定数据表中的字段和实体类中的属性的对应关系。

  • useCache属性:指定此查询操作是否需要缓存

  • timeout属性:设置超时时间

resultMap标签

1
2
3
4
5
6
7
8
<!-- resultMap标签用于定义实体类与数据表的映射关系(ORM) -->
<resultMap id="studentMap" type="Student">
<id column="sid" property="stuId"/>
<result column="stu_num" property="stuNum"/>
<result column="stu_name" property="stuName"/>
<result column="stu_gender" property="stuGender"/>
<result column="stu_age" property="stuAge"/>
</resultMap>

cache标签

设置当前DAO进行数据库操作时的缓存属性设置。

1
<cache type="" size="" readOnly="false"/>

sql和include

自定义 sql 片段。

1
2
3
4
5
<sql id="wanglaoji">sid , stu_num , stu_name , stu_gender , stu_age</sql>

<select id="listStudents" resultMap="studentMap">
select <include refid="wanglaoji"/> from tb_students
</select>

分页插件

分页插件是一个独立于MyBatis框架之外的第三方插件——PageHelper。

1. 添加分页插件的依赖

1
2
3
4
5
6
 <!-- pagehelper分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>

2. 配置插件

在 mybatis 的主配置文件 mybatis-config.xml 中通过 plugins 标签进行配置:

1
2
3
4
<!--plugins标签,用于配置MyBatis插件(分页插件)-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

3. 分页实例

对学生信息进行分页查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void testPagePlugins() {
StudentDAO studentDAO = MyBatisUtil.getMapper(StudentDAO.class);

//查询前先设置分页拦截器
//查询第一页的数据,每页2行数据
PageHelper.startPage(1,2);

List<Student> students = studentDAO.listStudents();

//封装分页数据
PageInfo<Student> pageInfo = new PageInfo<Student>(students);
/*
pageInfo中就包含了数据及分页信息
PageInfo{pageNum=1, pageSize=2, size=2, startRow=1, endRow=2, total=3, pages=2, list=Page{count=true, pageNum=1, pageSize=2, startRow=0, endRow=2, total=3, pages=2, reasonable=false, pageSizeZero=false}[User{id=0, username='王武', password='123'}, User{id=1001, username='张姗', password='123'}], prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=8, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}
*/

List<Student> list = pageInfo.getList();
for (Student stu : list) {
System.out.println(stu);
}

}

4. 带条件分页

只需在 sql 语句中使用 where 语句进行条件过滤。

1
2
3
4
5
6
7
8
@Test
public void testListStudentsByPage() {
StudentDAO studentDAO = MyBatisUtil.getMapper(StudentDAO.class); //sqlSession
PageHelper.startPage(2,4);
List<Student> list = studentDAO.listStudentsByGender("女");
PageInfo<Student> pageInfo = new PageInfo<Student>(list);

}