利用Mybatis 的动态SQL 实现物理分页 摘要:实际项目中,经常会遇到分页的问题,mybatis 自带的分页使用的是内存分页,如果数据量较大,那么必定
会发生内存溢出。本文提出一种方法,利用mybatis 强大的动态 sql,为查询语句加上物理分页功能。
关键词:mybatis 动态sql 分页 物理分页
the use of dynamicsql implementation mybatis physical page
chen-ling xia-xun
luzhou vocational andtechnical college,sichuan,luzhou,646005,china
abstracts:actual projects, the problems oftenencountered pages, mybatis own page using paging, if the data is large, thenthere must be a memory overflow occurs. this paper presents a method, usingmybatis powerful, dynamic sql, the query with the physical paging.
keywords:mybatis dynamic sql paging physicalpage
1、mybaits 简介
mybatis,前称ibatis,后改名为mybatis,截止本文成文,最新 版本是3.0.6。它和hibernate 是java世界使用最多的两种orm 框 架。hibernate 理念最为先进,完全实现面向对象的数据库编程,不需要掌握sql 语句,即可实现数据库操作,能够节省开发人员编 写大量sql语句的时间。但是,hibernate 在处理多表关联时,可 能会出现n+1 问题,性能会有较大影响,要解决性能问题,需要较 深的hibernate 知识和项目经验。mybatis 需要自己写sql 语句, 开发效率不如hibernate,很难做到底层多数据库的通用。但对程 序员来说有更高的可控性,可以更容易的对sql 语句进行优化,提 高效率。
在开发中直接使用jdbc 一个非常普遍的问题就是动态sql。如果 参数值、参数本身和数据列都是动态sql,通常的解决方法就是写很多if-else 条件语句和字符串连接。而mybatis 通过ognl 提供 了一套非常清晰的方法来解决动态sql 的问题。
2、实现mysql 的物理分页
mysql 使用limit 子句来实现数据库的物理分页,limit 子句接受 一个或两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数量。在mybatis 中,只需要在相 应的查询语句后,加上limit 子句,即可实现物理分页。如下,以 一个只有字段id,name,age 的表为例。该配置会根据传入的 hashmap,如果含有键start 和键end,那么即通过mybatis 强大的 动态sql,生成含有mysql 分页的sql语句。
select * from users
limit #{start},#{end}
3、实现oracle 的物理分页
oracle 数据库的物理分页,相对mysql没有那么方便,使用rownum 嵌套查询来实现分页,为简化配置,在mybatis 中定义一个oracle 的分页配置xml 文件,其它实体映射文件引入该文件即可。分页配 置xml 文件主要代码如下:
select * from ( select row_.*, rownum rownum_from (
) row_ where rownum #{start}
在需要做分页的查询语句中,最开始的位置引入head部分,最后 的位置引入tail 部分,如果在传入的hashmap,有键start 和键 end,即会动态生成含有oracle 物理分页的sql 语句。
select * from users
4、结语
分页查询是系统开发中常用的功能,mybatis3 和ibatis 2 自带 的分页,使用的是内存分页,即将所有数据读取到内存,然后判断 要显示哪些条目。如果数据量比较大,毫无疑问会发生内存溢出,客户端获取数据很慢甚至无法获取到数据,因此,实际开发中,使 用较多的是利用数据库自带的分页语句来实现物理分页。本文讲述 了如何为mybatis 3 添加mysql 和oracle的物理分页功能。
参考文献
[1]李辉,王瑞波.多条件分页查询优化的设计方法[j].计算机工 程,2010,2.
[2]李刚.轻量级java ee 企业应用实战[m].电子工业出版社,2011.