自定义分页Page实现


前言

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,这样写的好处就是,我们可以直接在mapper.xml文件中这样写

		查询sql
		
		limit
                #{
    
    pageNow}, #{
    
    pageSize}

其实这种分页的实体类是我个人感觉比较好用的一种,分页的方式有很多,如果开发使用,建议还是使用插件或者框架自带的page工具类,因为万一出点什么奇奇怪怪的bug,这又得加班了不是?

猜你喜欢

转载自blog.csdn.net/z318913/article/details/121572817