Why Page?
我们为什么要做分页?
1.前台页面有限,我们无法将所有的数据一次性显示。
2.数据库中的数据太多,一次性查询时间较长,影响性能。
What we want?
分析模型
是不是和你想的一样呢?做成这个东东我们需要哪些条件呢?
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
|
|
此外就是页面数据的查询,根据不同的数据库有不同的查询方式,但是最好使用一种通用的不区别数据的接口。
JPA提供的接口是十分方便的,几乎不需要我们做工作,只需要套用JPA的接口就可以了。
详细请看JPA的文档。
JPA官方文档