分页是web应用程序非常重要的一个技术。数据库中的数据可能是成千上万的,不可能把这么多的数据一次显示在浏览器上面。一般根据每行数据在页面上所占的空间每页显示若干行,比如一般20行是一个比较理想的显示状态。
分页技术的实现
目前分页技术实现有很多种,一种是将所有查询结果都保存在Session对象中,翻页的时候从Session对象中取出一页所需显示的数据并显示。这种做法有两个缺点:一是用户看到的可能是过期的数据,二是如果数据量非常大,获取结果集的时间会很长,而且这个结果集也会保存在内存中,占用大量的内存空间。
现在流行的分页做法是在每次翻页时,只从数据库里获取出本页所需的数据。这样虽然每次翻页都需要查询数据库,对数据库的查询次数增多了,但是查询出来的结果集比较小,网络传输量低,用户能很快的看到查询结果,在配以数据库连接池技术,效率会有很大的提高。下面是以Oracle作为后台数据库,介绍实现如何分页显示数据。另外提醒大家,不同的数据库厂商支持分页技术时所使用的SQL语句也不一样,Oracle使用ROWNUM关键字,MySQL使用Limit关键字,而SQL Server使用TOP关键字
下面将使用ROWNUM关键字编写实现分页的SQL语句,具体的SQL语句如下所示:
SELET employee_id, last_name,hire_date FROM(
SELECT ROWNUM AS m,t * FORM(
SELECT*FROM emplyees ORDER BY hire_date desc
) t WHERE ROWNUM <= 20
)WHERE M >10
分析该SQL语句,由里到外,它是由三层查询组成的,具体分析如下:
- 最内层查询—进行排序等限制
分解出最内层的查询语法如下:
SELECT*FROM employees ORDER BY hire_date desc
执行结果是将雇员信息表中的所有复原按雇佣日期降序排列
- 中间层查询—-设置最大记录数
在最内层查询的基础上,分解出中间层查询语句如下:
SELECT ROWNUM AS M,T.*FROM(最内层查询结果) t WHERE ROWNUM <=20
从中间层查询开始使用ROWNUM关键字进行分页处理,这天语句实在最内层查询结果的基础上,按照ROWNUM 行数的顺序取出前20条记录,实际上中间层的查询是为了设置查询结果的最大记录数,注意,中间层查询需要查询出ROWNUM伪列并设置别名(m),这是为了在最外层查询时使用。
- 最外层查询—-设置最小记录数
-中间层查询设置了最大记录数,最外层查询就要设置最小记录数,分解出来的最外层查询SQL语句如下:
SELECT employee_id,last_name,hire_date FROM(中间层查询结果) WHERE M >10
在最外层查询中,通过对中间层查询结果中别名为m的字段的限制,设置了最小记录数。整个SQL语句的目的是查询出按雇佣日期倒序排列的第11行到20行的数据。
- 参数化最大记录数和最小记录数
假设分页要求是每页显示20条记录,则第一页最小纪录是1,最大记录是20,第二页最小纪录是21,最大记录数是40,如果将每页显示的记录数用pageSize表示,当前页用pageIndex表示,则当前页数的最大记录数用pageSize*(pageIndex-1)+1,最大记录数为pageSize*pageIndex。
实现分页显示
- 确定每页显示记录数—–pageSize
- 计算总页数—–totalPages
- 获取当前页数
- 执行分页查询SQL语句,获取结果集,并显示信息
- 完成分页导航链接