公司使用的PageHelper插件比之前手动写分页方便多了,周末自行查资料总结了一下(毕竟国内牛人的开源项目,读中文文档要爽太多了),希望对想要快速上手的朋友提供一点帮助。
首先上一个小DEMO
1.添加Maven依赖
com.github.pagehelper
pagehelper
4.2.1
2.在 MyBatis 配置 xml 中配置拦截器插件(参数会在后面详细讲解)
3.service层,在原有的查询代码基础上增加分页方法
PageHelper.startPage(1, 10);//第一参数:当前页,第二个参数:每页行数(ps:此静态方法必须紧跟在查询前,它会自动绑定)
List list = countryMapper.selectIf(1);//原有的查询代码
这样就OK了,是不是很简单!
接下来详细介绍一下PageHelper的各种用法(点击查看官方文档)
一、配置拦截器有两种方式,选用一种即可,若两种方式同时配置会出错
(具体的参数配置,下面会详细说明)
1. 在 MyBatis 配置 xml 中配置拦截器插件
2. 在 Spring 配置文件中配置拦截器插件
使用 spring 的属性配置方式,可以使用 plugins
属性像下面这样配置:
params=value1
二、参数配置(比较常用的有1、4、5、6、7)
1.helperDialect:选择服务器方言(如mysql、oracle等)(注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012
)
2.offsetAsPageNum:默认false,只对RowBounds
作为分页参数时有效,作用是将 RowBounds
中的 offset
参数当成 pageNum
使用
3.rowBoundsWithCount
:默认值为false
,该参数对使用 RowBounds
作为分页参数时有效。 当该参数设置为true
时,使用 RowBounds
分页会进行 count 查询。
4.pageSizeZero
:默认值为 false
,当该参数设置为 true
时,如果 pageSize=0
或者 RowBounds.limit = 0
就会查询出全部的结果。
5.reasonable
:分页合理化参数,默认值为false
。当该参数设置为 true
时,pageNum<=0
时会查询第一页,pageNum>pages
(超过总数时),会查询最后一页。
6.params
:为了支持startPage(Object params)
方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable
,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
。
7.supportMethodsArguments
:支持通过 Mapper 接口参数来传递分页参数,默认值false
,分页插件会从查询方法的参数值中,自动根据上面 params
配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic
包下的 ArgumentsMapTest
和 ArgumentsObjTest
。
8.autoRuntimeDialect
:默认值为 false
。设置为 true
时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012
,只能使用sqlserver
)
9.closeConn
:默认值为 true
。当使用运行时动态数据源或没有设置 helperDialect
属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true
关闭,设置为 false
后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
注意:当offsetAsPageNum=false时,RowBounds
查询的时候就不存在pageNum了,所以reasonable自动转为false。
三、分页插件支持以下几种调用方式:
//第一种,RowBounds方式的调用(这种方式侵入性最小)
List list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
//不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数
List selectAll(RowBounds rowBounds);
//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List list = countryMapper.selectIf(1);
//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List list = countryMapper.selectIf(1);
/第四种,参数方法调用(后面有详细介绍)
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List list = countryMapper.selectByPageNumSize(user, 1, 10);
//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
//其他fields
//下面两个参数名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List list = countryMapper.selectByPageNumSize(user);
//第六种,ISelect 接口方式(具体的可以看文档)
使用PageInfo
的用法:
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List list = countryMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
assertEquals(1, page.getPageNum());//当前页
assertEquals(10, page.getPageSize());//每页行数
assertEquals(1, page.getStartRow());//当前页第一个元素所在数据库中的行号
assertEquals(10, page.getEndRow());//当前页最后一个元素所在数据库中的行号
assertEquals(183, page.getTotal());//数据库中总记录数
assertEquals(19, page.getPages());//总行数
assertEquals(1, page.getFirstPage());//
assertEquals(8, page.getLastPage());//
assertEquals(true, page.isFirstPage());//是否第一页
assertEquals(false, page.isLastPage());//是否最后一页
assertEquals(false, page.isHasPreviousPage());//是否有上一页
assertEquals(true, page.isHasNextPage());//是否有下一页
使用参数方式的注意事项:
想要使用参数方式,需要配置 supportMethodsArguments
参数为 true
,同时要配置 params
参数。 例如下面的配置:
在 MyBatis 方法中:
List selectByPageNumSize(
@Param("user") User user,
@Param("pageNumKey") int pageNum,
@Param("pageSizeKey") int pageSize);
当调用这个方法时,由于同时发现了 pageNumKey
和 pageSizeKey
参数,这个方法就会被分页。params 提供的几个参数都可以这样使用。
除了上面这种方式外,如果 User 对象中包含这两个参数值,也可以有下面的方法:
List selectByPageNumSize(User user);
当从 User 中同时发现了 pageNumKey
和 pageSizeKey
参数,这个方法就会被分页。
注意:pageNum
和 pageSize
两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。