关于ibatis进行物理游标分页

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

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

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

(1)定义一个接口Pager: 

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



(2)Pager实现类PagerImpl 

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




(3)扩展ibatis自带接口 SqlMapExecutor 

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




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

Java代码  收藏代码
  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.   
  11.     public Pager queryForPager(String id, Object parameterObject, int skip)  
  12.             throws SQLException {  
  13.         return getLocalSqlMapSession().queryForPager(id, parameterObject, skip,  
  14.                 SqlExecutor.NO_MAXIMUM_RESULTS);  
  15.     }  
  16.   
  17.     public Pager queryForPager(String id, Object parameterObject)  
  18.             throws SQLException {  
  19.         return getLocalSqlMapSession().queryForPager(id, parameterObject,  
  20.                 SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS);  
  21.     }  




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

Java代码  收藏代码
  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.   
  16.                 // Get Results  
  17.                 int resultsFetched = 0;  
  18.                 while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults)  
  19.                         && rs.next()) {  
  20.                     Object[] columnValues = resultMap  
  21.                             .resolveSubMap(request, rs).getResults(request, rs);  
  22.                     callback.handleResultObject(request, columnValues, rs);  
  23.                     resultsFetched++;  
  24.                 }  
  25.                 if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {  
  26.                     rs.last();  
  27.                     request.setRows(rs.getRow());  
  28.                 } else {  
  29.                     int total = skipResults + resultsFetched;  
  30.                     while(rs.next()){  
  31.                         total++;  
  32.                     }  
  33.                     request.setRows(total);  
  34.                 }  
  35.                   
  36.             }  





这样就可以了 

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

Java代码  收藏代码
  1. public static Pager pager(GroupVO vo,int offset,int limit)throws SQLException{  
  2.       return sqlMapper.queryForPager("list",vo,offset);  
  3.   }  



Java代码  收藏代码
  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.           
  10.         System.out.println("totalsize = "+pager.getRows());  
  11.         List list = pager.getList();  
  12.         if(list!=null)  
  13.             for(int i=0; i<list.size(); i++){  
  14.                 GroupVO v = (GroupVO)list.get(i);  
  15.                 System.out.println("group no = " + v.getGroup_no());  
  16.             }  
  17.           
  18.     } catch (SQLException e) {  
  19.         e.printStackTrace();  
  20.     }  
  21.   }  




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

posted @ 2016-03-08 13:02  mydddfly  阅读(464)  评论(0编辑  收藏  举报