ibatis 物理分页的简单实现

cheungmine 2013-8-26

使用SSI (Struts2, Spring3, iBATIS2.3)框架开发Web服务的时候有一个需求就是对查询得到的结果分页显示. iBATIS2的查询函数主要有: queryForList 和 queryForPaginatedList

queryForPaginatedList 据说可以直接分页, 以至于在数据量大了的时候, 性能急剧下降, 根本不能使用.

回到 queryForList, 如下调用可以取得queryEntities的全部数据:

List<EntityClass> entities = null;
        entities = getSqlMapClientTemplate().queryForList("queryEntities", paramsMap);

如果我们需要知道记录总数, 则需要:

List<Long> rowCount = getSqlMapClientTemplate().queryForList("getRowCount", paramsMap);

我的EntityClass.xml如下:

<!-- select sql -->
<select id="queryEntities"
parameterClass="java.util.HashMap"
resultClass="EntityClass"
resultMap="EntityClassResultMapDefault">
<![CDATA[
SELECT * FROM
]]> <dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="param.itemid">
<![CDATA[
(itemid = #param.itemid:VARCHAR#)
]]>
</isNotEmpty>
<isNotEmpty prepend="AND" property="param.brandname">
<![CDATA[
(brandname like #param.brandname:VARCHAR#)
]]>
</isNotEmpty>
</dynamic>
<dynamic prepend="LIMIT">
<isNotEmpty property="limit" >
<![CDATA[
#limit:INTEGER#
]]>
</isNotEmpty>
</dynamic>
<dynamic prepend="OFFSET">
<isNotEmpty property="offset" >
<![CDATA[
#offset:INTEGER#
]]>
</isNotEmpty>
</dynamic>
</select> <select id="getRowCount"
parameterClass="java.util.HashMap"
resultClass="java.lang.Long">
<![CDATA[
SELECT COUNT(*) FROM ent_table
]]> <dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="param.itemid">
<![CDATA[
(itemid = #param.itemid:VARCHAR#)
]]>
</isNotEmpty>
<isNotEmpty prepend="AND" property="param.brandname">
<![CDATA[
(brandname like #param.brandname:VARCHAR#)
]]>
</isNotEmpty>
</dynamic>
</select>

因此代码中需要在第一次执行queryEntities之前, 先执行getRowCount以取得记录数目. 而queryEntities由于采用了SELECT * FROM table WHERE condition LIMIT m OFFSET n 语法, 会自动跳过n个结果记录(0-based), 返回不超过m条记录. 这要求数据库支持, MySQL, Sqlite 可以. 注意, OFFSET n是在返回的结果集中跳过前n个.

以上是简单的iBATIS物理分页的实现, 显然每次我们翻页的时候都要执行一次查询, 但是由于我们只取得LIMIT 条记录, 因此对服务器的内存消耗是固定的小尺寸. 这对浏览大记录集尤为有用.

最新文章

  1. linux用终端上传文件和文件家到远程的服务器
  2. Redis附加功能之Redis事务
  3. 打印xls注意事项
  4. haskell入门
  5. js判断是否微信浏览器打开
  6. #include &lt;boost/scoped_ptr.hpp&gt;
  7. 再见,CSDN
  8. GO开发[六]:golang反射(reflect)
  9. [爬虫]Scrapy 错误ordinal not in range(128)
  10. 【Android Studio安装部署系列】二十九、Android Studio安装本地插件(以国际化方法插件AndroidLocalizationer为例)
  11. 洛谷 P2042 【[NOI2005]维护数列】
  12. 数字证书及CA介绍
  13. BZOJ 2929: [Poi1999]洞穴攀行
  14. 【洛谷P1854】花店橱窗 线性dp+路径输出
  15. YUV420格式解析&lt;转&gt;
  16. python标准模块(下)
  17. Delphi笔记-自定义提示窗口
  18. Python运维开发基础08-文件基础
  19. 为什么我不再用 .NET 框架(网摘)
  20. 微信小程序获取用户手机号,服务器解码demo

热门文章

  1. manacher算法_求最长回文子串长度
  2. 安装VMware-tools的问题
  3. (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
  4. Python 学习笔记(五)杂项
  5. servicestack操作redis
  6. PHPCMS V9实现硬件地址MAC绑定访问技术实现
  7. 性能测试-Jmeter
  8. linux 新学到的命令
  9. 《学习OpenCV》练习题第四章第三题b
  10. 使用ReflectionTestUtils解决依赖注入