最近自己在做一个项目时,该项目使用了SpringMVC+Mybatis框架的整合。数据库使用的是Oracle数据库,在写分页功能时发现Oracle数据库的分页语句和MySql有很大的不同。经过查找资料后,对分页的写法进行了一下抽取,使该分页语句能够较好的和Mybatis结合,不足之处还请多多指教,当然有更好的分页思想希望能和大家交流。
需求:我需要从sysuser 表中分页查询所有的用户。在user表中有如下字段:id(主键),groupId(用户类型),username(用户名称),用户所属单位名称需要从其他表中获取获取方法参照上一篇(nvl和decode函数的使用http://blog.csdn.net/iammrli/article/details/52769564)
分析:可能分页查询所有用户也可能是带有限定条件的查询用户信息。也可能会关联其他表查询相关的用户关联信息。
查询所有用户信息语句:select * from t_user
假设查询第10条到20条数据
select t.* from t_user t where rownum <= 20 由于不能使用rownum >= 1来进行限定所以需要另求他法。
可以从上面rownum<=20的结果集中选取后10条:select u.* from (select t.* ,rownum pagenum from t_user t where rownum <= 20)u where u.pagenum > 10
上面将rownum抽取成结果集的一个列属性,外层查询就可以使用改属性进行查询rownum大于10的结果。
基于上述思想,我把结果封装,然后从结果集中查询指定条数。于是有:
select * from (select page_1.* ,rownum pagenum from (select u.username,
u.groupid,
decode(groupid,
' 1',
(select mc from userjd jd where jd.id = u.sysid),
'2',
(select mc from userjd jd where jd.id = u.sysid),
'3',(select mc from useryy yy where yy.id = u.sysid),
'4',(select mc from usergys gys where gys.id = u.sysid)
)
from sysuser u where u.groupid = '3')page_1 where rownum <=30)page_2 where pagenum >=10 ;
如果进行抽取就可以将上述语句写成
select * from (select page_1.* ,rownum pagenum from (
//这里写查询语句,外层查询进行分页
select * from tablename where 查询条件
)page_1 where rownum <=30)page_2 where pagenum >=10 ;
这样我们就可以将上述语句中的30和10进行抽取成变量,放入一个查询条件的封装类中。假设该类为: PageQuery ,其中该类中有属性PageQuery_start(查询的起始位置)PageQuery_end(查询的结束位置)
那么Mybatis的mapper.xml中就可以这样组织: