0.从源码层面上理解PageHelper
简单的点击了一下,觉得挺复杂的,决定把设计模式透析之后,再来分析。PageHelper结合MyBatis进行使用,通过拦截器保证pageNum和pageSize以及total,然后一个 wrapper,还有一个代理模式。
1.搭建 PageHelper的工程环境。
1.1 添加依赖 网上很多只有一个依赖,你就加俩吧,有个错误会偶尔出现。total=0,这个问题。
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version></dependency>
1.2 application.properties 文件
# 指定数据库,不指定的话会默认自动检测数据库类型
pagehelper.helperDialect=mysql
# 是否启用分页合理化。
# 如果启用,当pagenum<1时,会自动查询第一页的数据,当pagenum>pages时,自动查询最后一页数据;
# 不启用的,以上两种情况都会返回空数据
pagehelper.reasonable=true
# 默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
pagehelper.supportMethodsArguments=true
# 用于从对象中根据属性名取值,
# 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
# 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
pagehelper.params=count=countSql
2. 代码中使用 分页插件
controller 层,一般不配置pageHelper参数,一般写在 serivice 层
2.1 假设存在实体 StuInfoResp
2.2 配置 PageBean
// 分页结果
public class PageBean<T> implements Serializable {private static final long serialVersionUID = 84154532474854546L;/*** 查询第几页 */private final int pageNum;/*** 每页多少条*/private final int pageSize;/*** 总条数*/private final long total;/*** 总页数*/private final int totalPages;/*** 分页结果序列*/private final List<T> content;public PageBean(final int pageNum, final int pageSize, final long total, final List<T> content) {this.pageNum = pageNum;this.pageSize = pageSize;this.total = total;this.content = content;this.totalPages = pageSize == 0 ? 0 : (int) Math.ceil((double) total / (double) pageSize);}/*** 返回当前页面数* @return*/public int getPageNum(){return pageNum;}/*** 返回每页长度* @return*/public int getPageSize(){return pageSize;}/*** 返回总页数* @return*/public int getTotalPages(){return totalPages;}/*** 是否还有下一页* @return*/public boolean hasNextPage(){return ((getPageNum() + 1) * getPageSize()) < total;}/*** 将查询出的结果以list形式返回* @return*/public List<T> getContent(){return content;}/*** 是否查询出结果* @return*/public boolean hasContent(){return !content.isEmpty();}/*** 获取总条数* @return*/public long getTotal() {return total;}}
2.3 工程中使用
public PageBean<StuInfoResp> function(YouReq req) {Page<Object> page = PageHelper.startPage(req.getPageNum(), req.getPageSize());PageHelper.orderBy("created_time desc");PageBean<StuInfoResp> pageBean = new PageBean<>(req.getPageNum(), req.getPageSize(), page.getTotal(), Lists.newArrayList());// TODO 你的业务数据封装成 Listreturn pageBean;}