分页模型的分析

Why Page?

我们为什么要做分页?
1.前台页面有限,我们无法将所有的数据一次性显示。
2.数据库中的数据太多,一次性查询时间较长,影响性能。

What we want?

页数少的分页

一到十分页

n1,n1+10分页

分析模型

是不是和你想的一样呢?做成这个东东我们需要哪些条件呢?
1.我们需要定义一页显示多少条数据,在这里定义为pageSize。
2.我们需要知道要显示第几页的数据,在这里定义为pageNumber。
3.我们需要定义显示页数范围的大小,在这里定义为rangeSize。
    (上图中rangeSize为10)
4.我们需要动态的得到具体显示页数的值,在这里定义为  List<Integer>  pages<Integer>。
    (图一为1-4,图二为1-10,图三为5-14)
5.如何得到pages<Integer>?细想一下,我们只需要知道开始页和结束页,然后将他们范围内的数进行遍历就可以了对吧。
6.开始页如何得到?(开始页:pageStart)
    最容易的就是图三,pageStart=pageNumber-rangeSize/2;
    还算容易的就是图一,那就是1。
    其实图二也很容易,也是1嘛。原因就是pageNumber<rangeSize/2;
    发现一个规律,(pageNubmer<rangeSize/2)?(pageStart=1):(pageStart=pageNumber-rangSize/2)
    用一种简单的方式表示就是pageStart=Max(0,(pageNumber-rangeSize/2))
7.结束页如何得到?(结束页:pageEnd,数据的总条数count)
    还是图三比较容易,pageEnd3=pageNumber+rangeSize/2-1;
    这次图二也比较明显,pageEnd2=rangeSize;
    图一也挺容易,pageEnd1=count/pageSize;
    分析一下这三者的关系,pageEnd2与pageEnd3取其大,pageEnd1与pageEnd2和pageEnd3,取其小。
    所以,
    pageEnd=min(pageEnd1,max(pageEnd3,pageEnd2))
    也就是     pageEnd=min(count/pageSize,max(pageNumber+rangeSize/2-1,count/pageSize))
8.从7点我们可以看出我们来需要得到总的数据条数count;

How

    public Integer rangeSize=10;
    public Integer pageSize=10;
    /**
     * 计算连续显示页的起始页码
     */
    public int getPageNumberStart(Integer pageNumber) {
        return Math.max(0, pageNumber - rangeSize / 2);
    }
    /**
     * 计算连续显示页的结束页码
     */
    public int getPageNumberEnd(Integer pageNumber,Integer count) {
        return Math.min(Math.max(pageNumber + rangeSize / 2 - 1,rangeSize),count/pageSize);
    }
    /**
     * 获得连续显示页的页码
     */
    public List<Integer> getPages(Integer pageNumber,Integer count) {
        Integer startPage = this.getPageNumberStart(pageNumber);
        Integer endPage = this.getPageNumberEnd(pageNumber,count);
        List<Integer> pages = new ArrayList<Integer>();
        for (int i = startPage + 1; i <= endPage + 1; i++) {
            pages.add(i);
        }
        return pages;
    }
此外就是页面数据的查询,根据不同的数据库有不同的查询方式,但是最好使用一种通用的不区别数据的接口。
JPA提供的接口是十分方便的,几乎不需要我们做工作,只需要套用JPA的接口就可以了。

详细请看JPA的文档。
JPA官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值