Spring Boot系列: 点击查看Spring Boot系列文章
要说MyBatis最常用的分页插件是什么?那一定非PageHelper不可了。
下面是官方的介绍
MyBatis 分页插件 PageHelper
如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。
下面,我们就在Spring Boot集成PageHelper
1、pom.xml添加依赖
注意:我们在Spring Boot推荐的依赖是pagehelper-spring-boot-starter,而不是单纯的pagehelper,pagehelper-spring-boot-starter对Spring Boot的集成性更好
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
2、配置pagehelper属性
其实在Spring Boot中,pagehelper不在配置文件配置,也可以使用基础的分页功能。只是在我们需要使用到一些特性功能的时候,才需要配置
在application.properties,添加pagehelper的配置信息
#pagehelper分页插件配置
pagehelper.helper-dialect=mysql
pagehelper.params=count=countSql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
下面是pagehelper的常用配置属性
1、helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
我使用的是Mysql数据库,所以pagehelper.helper-dialect=mysql
2、pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
3、reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
4、params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
5、supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。
6、offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
7、autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver)
3、使用pagehelper
使用pagehelper有多种方法,下面来看一些比较常见的用法
第一种方法:PageHelper.startPage 静态方法调用
在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
例:
@Test
public void test1(){
// 查询第一页的10条数据
PageHelper.startPage(1, 10);
// 查询sql
List<User> allUser = userMapper.findAllUser();
// 用PageInfo对结果进行包装
PageInfo<User>userPageInfo=new PageInfo<>(allUser);
}
注意:分页只对在PageHelper.startPage后面的第一个查询方法有效,如果你在中间放入一个其他的查询,是无法分页的
例:
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List<Country> list = countryMapper.selectIf(1);
//后面的不会被分页,除非再次调用PageHelper.startPage
List<Country> list2 = countryMapper.selectIf(null);
PageInfo
PageInfo是用于封装分页数据的一个类,里面包含了非常全面的分页属性
第二种方式:使用参数方式
想要使用参数方式,需要配置 supportMethodsArguments 参数为 true,同时要配置 params 参数。 例如下面的配置:
pagehelper.params=pageNum=pageNumKey;pageSize=pageSizeKey
pagehelper.support-methods-arguments=true
mapper方法
@Select("SELECT * FROM user")
List<User> selectByPageNumSize( @Param("pageNumKey") int pageNum,
@Param("pageSizeKey") int pageSize);
当调用这个方法时,如果同时发现了 pageNumKey 和 pageSizeKey 参数,那么这个方法就会被分页。
注意:pageNum 和 pageSize 两个属性同时存在才会触发分页操作