Spring Boot 集成 PageHelper 分页插件实战
前言
这是一篇介绍 spring boot 集成 PageHelper 分页插件的实战教程,如果你恰好需要在 spring boot 项目中集成该插件,那么不必费心去查看官方文档,照着做就可以了。
配置步骤
1. 引入依赖
由于我们这里专门针对 spring boot 项目,有专门针对 spring boot 项目的 starter。项目中直接引入下面的 starter 即可。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.5</version>
</dependency>
2. starter 配置
引入 starter 之后,剩下的就是在 application.properties 或者 application.yml 中配置 starter 提供的配置选项了,我们这里以 yml 配置为例,配置如下:
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
没错,到这里集成分页插件就全部结束了。还有很多其他配置项,是否需要?有可能,看项目需求了,如果有需要再配置不迟。
一些 starter 参数说明
reasonable
控制分页是否合理,如果配置为 true, 当页码是负数或0时,返回第一页数据,当大于最大页码时,返回最后一页内容。
params
为了支持 startPage(Object params)
方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
startPage 方法会从参数 params 中获取分页参数供分页插件使用。可以看到 params 参数是 Object 类型,默认情况,如果不配置,分页所需的参数,例如:页码、分页大小会根据反射取 params 对象中的 pageNum, pageSize 等属性,但是如果我们的项目中用的分页参数是 pageNo 和 pageLimit,那么我们可以配置如下:
pagehelper:
params: pageNum=pageNo;pageSize=pageLimit
count=countSql 的特别说明
startPage(Object params)
,默认情况,会根据 params 对象中的名为 countSql 的属性(bool类型)决定是否执行 count 语句,如果我们传入的 params 对象的 countSql 属性为 false,那么就不会执行 count 语句。
注:这里 params 对象也可以是 map,如果是 map,那么就找 key 为 countSql 对应的 value,如果是其他对象,那么根据反射获取属性名为 countSql 对应的值。
分页插件生成低效 count sql 语句的原因
- (1) sql 包含 group by 的时候,会生成带子查询的低效 count sql
- (2) sql 包含 distinct 的时候,会生成带子查询的低效 count sql
- (3) sql 的列中包含参数的时候,会生成带子查询的低效 count sql
- (4) sql 的列中包含函数的时候,会生成带子查询的低效 count sql
从 5.1.5 版本开始有一个优化:对函数进行区分,如果是聚合函数(例如:avg/sum等)生成带子查询的 countsql,如果非聚合函数生成简单的 countsql。我们可以通过配置追加一些自定义的聚合函数:
pagehelper:
aggregateFunctions: sum,avg
不用担心追加是否会导致重复,PageHelper 插件内部会处理重复。
supportMethodsArguments
支持通过 Mapper 接口参数来传递分页参数,默认值 false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
List<User> selectByPageNumSizeOrderBy(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize, @Param("orderBy") String orderBy);
温馨提示:反馈需要登录