Oracle数据库分页技术的应用
一、前言
Oracle数据库是一款关系型数据库管理系统, 它支持大数据量的事务和分布式数据处理, 系统性能优越、可移植性好, 适用于各种不同的工作环境, 是一种高效率的数据库解决方案。当开发数据库应用软件时, 经常会根据需求查询限定行或分页的数据, MySQL数据库中可以使用LIMIT子句完成, MS Ssql Server数据库中可以使用TOP子句完成, Oracle数据库中如何实现类似的查询工作呢[1,2]?
二、rownum伪列
Oracle提供了一个rownum的伪字段, 根据SQL查询出的结果给每行分配一个逻辑编号, 所以SQL不同也就会导致最终rownum不同。
(一) 限定查询行数
如果希望限定查询结果集的前几条数据, 通过rownum可以轻松实现。
示例:
--查找前10名学生的记录
SELECT*FROM student WHERE rownum<=10;
(二) 分页查询
在数据库应用系统中, 我们会经常使用到分页功能, 如每页显示5条记录, 查询第2页内容该如何查询呢?
--错误查询语句
SELECT*FROM student WHERE rownum>5 AND rownum<=10;
上面的SQL语句是否能查询出我们想要的结果呢?
当student表中有20条记录, 执行该SQL语句就会发现, 该结果查询不出任何记录。因为rownum是对查询后的结果集添加的一个伪列。它总是默认从1开始的。因此, 如果想查询类似rownum>5这种条件就需要先生成rownum, 然后再对生成结果进行查询。
示例:
SELECT s2.*FROM (SELECT ROWNUM r, s1.*FROM student s1 WHERE ROWNUM<=10) s2 WHERE s2.r>5;
内层查询语句小于等于要查询页数的最大条数, 外层查询语句大于等于要查询页数的最小条数。
(三) rownum的使用限制
在查询语句中, 不能对rownum使用>、>=、=这样的查询条件, 否则查询不到我们想要的结果。在对非主键的字段执行order by子句时, 查询结果并非按照我们所期望的先排序再取特定记录数;而order by的字段是主键时才会先排序再计算rownum的值。
三、高复用分页类Pagination.java
分业实现方式通常有两种方式:一种是一次性读入符合查询条件的数据保存到内容中, 然后通过相关业务类实现分页处理功能;另一种是根据客户需求, 每次分别从数据库中读取指定数量的记录。通常第二种方式的执行效率要高些[3]。
在实际开发分页应用程序时, 我们通常封装高复用的分页类来实现分页功能。该类封装了分页的页面实现逻辑。程序代码如下:
四、数据访问层Dao的实现
以分页查询学生数据为例, 在设计数据访问层Dao功能实现中, 调用pagination对象的set Count Size (rs.getInt (“counts”) ) 方法, 将数据库中读取的所有学生记录数封装到高复用分页对象Pagination中, 然后通过pagination对象设置当前页currPage和每页显示页数pageSize属性计算出当前页要查询记录的起始和结束位置, 进而查询出指定的结果集。示例代码片段如下:
五、页面控制层功能实现
当从前端页面请求后端数据响应式, 会传递要查询的指定数据 (包括要查询的页码) 。通过数据访问层Dao中定义的getAllStudents () 方法查询出指定页数的集合对象, 然后转发到视图页面index.jsp显示查询结果。
六、结束语
本文通过Oracle数据库中Rownnum伪关键字实现了通用数据库分页的方法, 相对于其他分页技术的实现, 这种方法简单灵活、实用性强, 在实际项目开发中得到了很好地应用。
摘要:Oracle数据库分页技术在应用程序开发中经常会使用到, 分页查询效率直接关系到应用系统地性能。本文介绍Oracle数据库通用分页技术的实现方法, 在实际项目应用过程中取得良好的效果。
关键词:Oracle,分页查询,rownum
参考文献
[1] 孙风栋, 闫海珍.Oracle10g数据库海量数据分页查询优化[J].计算机应用与软件, 2011 (9) :137-139.
[2] 张辉, 赵郁亮, 徐江, 等.基于Oracle数据库海量数据的查询优化研究[J].计算机技术与发展, 2012 (2) :165-167.
[3] 徐越人.OracleRownum的使用与JSP分页显示的实现[J].计算机与现代化, 2007 (10) :86-90.