本篇介绍Mybatis分页插件PageHelper的使用,本质上是Mybatis拦截器起作用,在执行目标SQL之前添加count语句及拼接limit到目标SQL后面,这里不再赘述,Mybatis拦截器相关知识可参考Mybatis——拦截器Interceptor,本篇仅简单介绍如何让一个使用Mybatis+springboot的项目快速接入PageHelper;
背景:接到需求,需要对一个老工程新写几个分页查询及导出的接口;查看了这个工程的代码,发现历史的分页接口竟然是手动拼出来的,非常之丑陋,准备引入Mybatis自带的分页插件,顺带记录下遇到的问题和最终引入PageHelper的步骤;
遇到问题1:根据经验,只需要引入一个PageHelper的二方包,在springboot下,会自动注册Mybatis Interceptor并生效;发现SQL可以正常执行,但是分页参数都没有填充;所以问题应该是PageHelper并没有被正确的加入Mybatis拦截器列表,这一步可以通过打印原始的SQL来验证;
解决方案:继续引入pagehelper-spring-boot-starter并在配置类加载PageHelper的Bean;
遇到问题2:按照上述方案成功的引入了pagehelper,并且分页参数都被正常的填充;但是当把分页插件原生的com.github.pagehelper.Page<T>作为返参返回时,发现缺失了分页参数如total、pageNum、pageSize等;发现Page其实仅继承了java.util.ArrayList,因此序列化的时候会当做一个List处理,分页参数都缺失了;
解决方案:自己封装分页返参实体类;
总结下正确引入Mybatis分页插件PageHelper的姿势
(1)引入依赖
以下依赖建议放到dal模块:
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
以下依赖建议放到启动/配置boot模块
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
(2)配置Bean
@Configuration
public class PageHelperConfig {
@Bean
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum", "true");
properties.setProperty("rowBoundsWithCount", "true");
properties.setProperty("reasonable", "true");
properties.setProperty("dialect", "mysql");
pageHelper.setProperties(properties);
return pageHelper;
}
}
(3)封装返参
/**
* @author Akira
* @description 默认的分页查询的封装类
*/
@Data
public class DefaultPageDTO<T> {
/**
* 页码
*/
private Integer pageNum;
/**
* 页面大小,默认size为10
*/
private Integer pageSize;
/**
* 总数
*/
private Long total;
/**
* 总页数
*/
private Integer pages;
/**
* 查询记录列表
*/
private List<T> records;
/**
* 将com.github.pagehelper.Page封装成能打印出分页参数的DefaultPageDTO
*
* @param page
* @param <T,R>
* @return
*/
public static <T, R> DefaultPageDTO<R> init(Page<T> page, Function<T, R> converter) {
DefaultPageDTO<R> defaultPageDTO = new DefaultPageDTO<>();
defaultPageDTO.setPageNum(page.getPageNum());
defaultPageDTO.setPages(page.getPages());
defaultPageDTO.setTotal(page.getTotal());
defaultPageDTO.setPageSize(page.getPageSize());
if (page.getTotal() > 0) {
defaultPageDTO.setRecords(page.getResult().stream().map(converter).collect(Collectors.toList()));
}
return defaultPageDTO;
}
}