自定义Page封装
- 前言
- 一、需求
- 二、封装page实体类
- 1.代码
- 2.结合mybatis使用
前言
web项目开发过程中,有很多的数据遍历需要用到分页,尽管现在很多的框架和插件都可以直接使用封装好的分页,但是处于学习的目的,我们还是要自己看一下底层的代码,自己使用原生的代码来实现一下。
一、需求
自定义分页,其实无非就是自己对分页数据的一个处理,其实就是包括总条数、页数、每页数量等这些返回给前端的数据进行一个处理,其大致思路如下:
当前页 pageNow
总页码 pageTotal
当页数据数量 pageSize
总数据条数 pageTotalCount
当页数据集合 list
这里考虑到一些逻辑的问题,就是有的数据不需要自定义,而是通过其他的数据计算而来的,其逻辑如下:
如果 总数据条数 % 当前页数量 == 0
那么 总页数 = 总数据条数 / 当前页数量
否则
那么
总页数 = 总数据条数 / 当前页数量 + 1
二、封装page实体类
1.代码
代码如下:
public class Page<T> {
//当前页
private Integer pageNow;
//总页码
private Integer pageTotal;
//当前页显示的数量
private Integer pageSize;
//总记录数
private Integer pageTotalCount;
//当前开始值
private Integer start;
//当前页数据
private ArrayList<T> list;
public Page( Integer pageNow,
Integer pageSize,
Integer pageTotalCount,
ArrayList list) {
//当前页码
this.pageNow = pageNow;
//每页的记录条数
this.pageSize = pageSize;
//数据总条数
this.pageTotalCount = pageTotalCount;
//总页数
this.pageTotal =
pageTotalCount % pageSize == 0 ?
(pageTotalCount / pageSize) :
(pageTotalCount / pageSize) + 1;
//数据内容
this.list = list;
getter、setter方法省略...
}
2.结合mybatis使用
实际上,结合上述分页实体类代码,我们可以了解到,这些数据中只有pageNow、pageSize是需要自定义的,其他的数据都可以使用limit从数据库查询,所以结合mybatis的实例代码如下:
//从数据库查询分页记录
ArrayList<FindVideo> allVideo = videoMapper.findAllVideo((pageNow - 1) * pageSize, pageSize);
//从数据库查询符合条件的总条数
Integer counts = videoMapper.counts();
//封装分页实体类
Page<FindVideo> videoPage = new Page<>(pageNow, pageSize, counts, allVideo);
这里做出解释,实际上为了sql简单,我们把对pageNow、pageSize的处理放到了参数传输,所以这里的mapper的两个参数是 (pageNow - 1) * pageSize和pageSize,这样写的好处就是,我们可以直接在文件中这样写
查询sql
limit
#{pageNow}, #{pageSize}
其实这种分页的实体类是我个人感觉比较好用的一种,分页的方式有很多,如果开发使用,建议还是使用插件或者框架自带的page工具类,因为万一出点什么奇奇怪怪的bug,这又得加班了不是?