http://www.iteye.com/topic/136712

详细demo:参照http://www.kusoft.net

我的数据库是采用mssql2000 
采用分页必定数据量比较大: 
按照ibatis的自带的是缓存分页.如果一大的肯定内存吃不消. 但是可以采用queryForList,却得不到总记录数码相. 
要得到总记录数,因此我采用物理游标进行分页. 
功能:需要得到结果的记录数,显示每页几行

(1)定义一个接口Pager:

  1. public interface Pager {
  2. //总共几行
  3. public int getRows();
  4. //存入一页的数据
  5. public List<Object> getList();
  6. public void setList(List<Object> list);
  7. public void setRows(int rows);
  8. }

(2)Pager实现类PagerImpl

  1. public class PagerImpl implements Pager {
  2. private List<Object> list = null;
  3. private int rows = 0;
  4. public List<Object> getList() {
  5. return list;
  6. }
  7. public void setList(List<Object> list) {
  8. this.list = list;
  9. }
  10. public int getRows() {
  11. return rows;
  12. }
  13. public void setRows(int rows) {
  14. this.rows = rows;
  15. }
  16. }

(3)扩展ibatis自带接口 SqlMapExecutor

  1. //skip 起启行,max每页几行
  2. Pager queryForPager(String id, Object parameterObject, int skip, int max) throws SQLException;
  3. Pager queryForPager(String id, Object parameterObject, int skip) throws SQLException;
  4. //根据条件查出所有结果
  5. Pager queryForPager(String id, Object parameterObject) throws SQLException;

(4)扩展ibatis接口 SqlMapExecutor的实现类有两个SqlMapClientImpl,SqlMapSessionImpl

  1. SqlMapClientImpl的扩展如下
  2. public Pager queryForPager(String id, Object paramObject, int skip, int max)
  3. throws SQLException {
  4. if (max <= 0)
  5. return getLocalSqlMapSession().queryForPager(id, paramObject, skip);
  6. else
  7. return getLocalSqlMapSession().queryForPager(id, paramObject, skip,
  8. max);
  9. }
  10. public Pager queryForPager(String id, Object parameterObject, int skip)
  11. throws SQLException {
  12. return getLocalSqlMapSession().queryForPager(id, parameterObject, skip,
  13. SqlExecutor.NO_MAXIMUM_RESULTS);
  14. }
  15. public Pager queryForPager(String id, Object parameterObject)
  16. throws SQLException {
  17. return getLocalSqlMapSession().queryForPager(id, parameterObject,
  18. SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS);
  19. }

(5)最终修改SqlExecutor获取总记录数 
SqlExecutor:439行

  1. if (resultMap != null) {
  2. // Skip Results
  3. if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
  4. rs.beforeFirst();
  5. if (skipResults > 0) {
  6. rs.absolute(skipResults);
  7. }
  8. } else {
  9. for (int i = 0; i < skipResults; i++) {
  10. if (!rs.next()) {
  11. return;
  12. }
  13. }
  14. }
  15. // Get Results
  16. int resultsFetched = 0;
  17. while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults)
  18. && rs.next()) {
  19. Object[] columnValues = resultMap
  20. .resolveSubMap(request, rs).getResults(request, rs);
  21. callback.handleResultObject(request, columnValues, rs);
  22. resultsFetched++;
  23. }
  24. if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
  25. rs.last();
  26. request.setRows(rs.getRow());
  27. } else {
  28. int total = skipResults + resultsFetched;
  29. while(rs.next()){
  30. total++;
  31. }
  32. request.setRows(total);
  33. }
  34. }

这样就可以了

(6)如何调用 
6.1创建一个方法

  1. public static Pager pager(GroupVO vo,int offset,int limit)throws SQLException{
  2. return sqlMapper.queryForPager("list",vo,offset);
  3. }
  1. public static void main(String[] args){
  2. try {
  3. SimpleExample se = new SimpleExample();
  4. GroupVO vo = new GroupVO();
  5. Pager pager = se.pager(vo,0,10);
  6. //vo.setGroup_no("100");
  7. //vo.setGroup_name("fengjian");
  8. //vo.setGroup_desc("thanks");
  9. System.out.println("totalsize = "+pager.getRows());
  10. List list = pager.getList();
  11. if(list!=null)
  12. for(int i=0; i<list.size(); i++){
  13. GroupVO v = (GroupVO)list.get(i);
  14. System.out.println("group no = " + v.getGroup_no());
  15. }
  16. } catch (SQLException e) {
  17. e.printStackTrace();
  18. }
  19. }

有什么不同看法:msn:linuxfjy@hotmail.com, mail: kusoft@qq.com

关于ibatis进行物理游标分页的更多相关文章

  1. DRF框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter

    drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...

  2. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)

    url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...

  3. drf偏移分页组件-游标分页-自定义过滤器-过滤器插件django-filter

    drf偏移分页组件 LimitOffsetPagination 源码分析:获取参数 pahenations.py from rest_framework.pagination import Limit ...

  4. ibatis 实现 物理级别的 分页 兼容多种数据库(转载)

    最近在看iBatis时,想做用动态Sql做个分布.因为在做项目时用iBator工具生成没有分页的功能,只有一些我们常用的功能.所以要对生成后的代码做修改.我在Java高手真经的一书中看到有做了MySq ...

  5. oracle ibatis 存储过程 返回游标 嵌套表

    自己解决问题了 问题总结: 1.index by表不能存储在数据库中的type中,故选择嵌套表. 2.ibatis不支持oracle的复合数据类型的返回.(个人理解) 3.替代方案:用返回oracle ...

  6. solr研磨之游标分页

    普通分页 当需要深度分页的时候,比如查询第10000页数据,每页显示10条,意味着需要提取前10000 x 10 页的数据,并将这100000条数据缓存在内存中,然后在内存中进行排序.最后返回最后10 ...

  7. Ibatis调用存储过程实现增删改以及分页查询

    1.Ibatis实现增删改操作很简单了,通常我是将某一模块的增删改功能写在一个存储过程里,通过一个标识符去区分执行增加还是修改抑或删除操作. statement: <!-- 存储过程:实现学生的 ...

  8. IBatis的分页研究

    IBatis的分页研究 博客分类: Ibatis学习   摘自: http://cpu.iteye.com/blog/311395 yangtingkun   Oracle分页查询语句 ibaits. ...

  9. ASP.NET和MSSQL高性能分页

    首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ======= ...

随机推荐

  1. [Tommas] SQL 中 WITH AS 的用法

    WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到: 下面的例子定义了一个 Temp 片段,Te ...

  2. selenium WebDriver 获取disabled文本框内容(转)

    有这样一个元素:<input name="name" id="id" type="text" disabled="true& ...

  3. JZ2440开发笔记(8)——FCLK、HCLK和PCLK

    S3C2440中有三种时钟,分别是FCLK,HCLK和PCLK.这三种时钟的功能各不相同,其中FCLK主要是为ARM920T的内核提供工作频率,如图: HCLK主要是为S3C2440 AHB总线(Ad ...

  4. 【CSS】Intermediate2:Pseudo Classes

    1.specify a state or relation to the selector selector:pseudo_class { property: value; } 2.Link 3.Dy ...

  5. 揭开嵌入式c面试题背后的玄机

    今天老大让我针对一个面试者出些嵌入式方面的面试题,主要是想对他的技术深度进一步了解.我就出了下面这些问题,每个问题背后都是考察一个嵌入式程序员应该具备的相关技能.当然这些只是我的个人理解,不一定正确. ...

  6. Java笔记(十七)……异常

    异常概述 异常是什么 是对问题的描述,将问题进行对象的封装 异常体系 Throwable |---Error |---Exception |---RuntimeException 异常体系的特点 异常 ...

  7. NOIP2000 乘积最大

    题二  乘积最大              (22分)    问题描述      今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏 ...

  8. 使用Windows Azure创建Linux系统虚拟机-上

    创建虚拟机来运行Linux 当您在Azure管理门户中使用映像图库时,创建运行Linux的虚拟机很容易.本指南告诉您如何做到这一点,假设你没有使用过Azure. 注意: 即使你不需要使用过Azure虚 ...

  9. HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html 第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~ 个人 ...

  10. Java 下 SSL 通信原理及实例

    有关SSL的原理和介绍在网上已经有不少,对于Java下使用keytool生成证书,配置SSL通信的教程也非常多.但如果我们不能够亲自动手做一个SSL Sever和SSL Client,可能就永远也不能 ...