分页模型的分析

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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官方文档

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章