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 你的业务数据封装成 List
return pageBean;
}