一、实现原理:
在oracle数据库中提供有ROWNUM伪列,该伪列的作用是:
1)取得第一行数据
2)取得前N行数据
利用第二条特性可以很方便的实现分页
以Oracle中自带的Emp表为例,执行带有ROWNUM的查询,取出第6-12行的数据:
SELECT empno,ename,job,ROWNUM FROM emp WHERE ROWNUM<=12 ;
之后,将查询的结果作为一张临时表进行查询,将范围限定在第5行之后 。
(要为ROWNUM设置别名,方便数据取出)
SELECT * FROM ( SELECT empno,ROWNUM rn FROM emp WHERE ROWNUM<=12) temp WHERE temp.rn>5 ;
虽然ROWNUM只能取前N行的数据,但在子查询中是将第一次查询的结果作为了一张新的表,而rn只是表中的一个列,因此可以任意限定
二、程序中使用
清楚了原理之后,一般需要4个参数来控制分页: 1)当前所在页:currentPage 2)每页显示的行数:lineSize 3)模糊查询的列:column 4)关键字:keyWord
通过这些参数可以完成大部分业务需求,使用currentPage * lineSize限定ROWNUM,依然以emp表为例,假设每页要显示7条数据,查询第3页的内容:
currentPage = 3
lineSize = 7
则此时ROWNUM<=21 即:ROWNUM <= currentPage * lineSize
外层查询 rn>14 即:temp.rn > ( currentPage - 1 ) * lineSize
有模糊查询时在子查询中增加LIKE即可
最终的sql:
SELECT * FROM ( SELECT empno,ROWNUM rn FROM emp WHERE ROWNUM<=(currentPage * lineSize) AND column LIKE '%' ) temp WHERE temp.rn>((currentPage - 1) * lineSize)
在程序中将参数用占位符替换,之后分别设置即可 。