由于现代数据库查询的数据量很多,我们往往采用分页的办法,这样既可以更好的展示数据,又可以不用因为一次查询太多数据导致响应过慢。Mybatis提供了PageHelper插件用于分页查询。
基础使用
1. 导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2. 在主配置文件中添加插件 使用插件标签<plugin> (注意标签的位置)
(properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
3. 测试分页功能
@Test
public void testPage(){
PageHelper.startPage(1,2);
List<User> users = mapper.queryUsers();
for (User user : users) {
System.out.println(user);
}
System.out.println("========================");
users = mapper.queryUsers();
for (User user : users) {
System.out.println(user);
}
}
[注]:1. 分页查询通过设置PageHelper.start(查询第几页[页号从1开始],一页几条数据)实现,只针对之后的第一个查询有效。
2. 其实这款分页插件帮助我们做的就是在SQL后追加LIMIT,底层还是使用原生的SQL实现的。
3. 分页插件不支持带有排他锁 "for update" 的查询语句。
4. 分页插件不支持“嵌套查询”,可能得不到正确的结果数量。
进阶操作
Mybatis的分页插件还提供了PageInfo类,它具有很多属性,便于进阶开发。
属性详解:
private int pageNum : 当前页
private int pageSize : 每页的数量
private int size : 当前页的数量(因为最后一页可能没填满,如11条记录,每页3条,最后一个只有2条)
private int startRow : 当前页面第一个元素在数据库中的行号
private int endRow : 当前页面最后一个元素在数据库中的行号
private int pages : 总页数
private int prePage : 前一页的页号,没有则为0
private int nextPage : 后一页的页号,没有则为0
private boolean isFirstPage : 是否为第一页
private boolean isLastPage = false : 是否为最后一页
private long total : 总记录数
private boolean hasPreviousPage = false : 是否有前一页
private boolean hasNextPage = false : 是否有下一页
private int navigatePages : 每一页所有的导航页码的数量
private int[] navigatepageNums : 存储所有页号的数组
private int navigateFirstPage : 第一页的页号
private int navigateLastPage : 最后一页的页号
private int total : 总的页数
[注]:其中navigatePages属性可能比较难理解,它指的是下图中的1、2、、、、、、10这些标签页的数量,即每一页展示的导航页的数量。