iBATIS分页的一些理解

开发 后端
iBATIS分页的一些理解向我们介绍了在使用iBATIS分页时的一点体会和大家分享。

iBATIS分页中有一个很吸引人的方法,queryForPaginatedList(java.lang.String id, int pageSize),可以返回 PaginatedList的对象,实现翻页,刚才测试了一下PaginatedList,在1-2w行数据的时候还可以工作,但是在一个30w行的表里翻页,一次select用了363.031second

忍不住看了一下源,发现iBATIS的分页依赖于数据库的jdbcDriver.

调用次序如下

  1. SqlMapClientImpl.queryForPaginatedList  
  2. ->SqlMapSessionImpl.queryForPaginatedList   
  3. ->SqlMapExecutorDelegate.queryForPaginatedList  
  4. ->GeneralStatement.executeQueryForList   
  5. ->GeneralStatment.executeQueryWithCallback  
  6. ->GeneralStatment.executeQueryWithCallback   
  7. ->SqlExecutor.executeQuery  
  8. ->SqlExecutor.handleMultipleResults()  

iBATIS分页处理的函数如下

Java代码

  1. private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback); throws SQLException {     
  2.     try {     
  3.       request.setResultSet(rs);;     
  4.       ResultMap resultMap = request.getResultMap();;     
  5.       if (resultMap != null); {     
  6.         // Skip Results     
  7.         if (rs.getType(); != ResultSet.TYPE_FORWARD_ONLY); {     
  8.           if (skipResults > 0); {     
  9.             rs.absolute(skipResults);;     
  10.           }     
  11.         } else {     
  12.           for (int i = 0; i < skipResults; i++); {     
  13.             if (!rs.next();); {     
  14.               return;     
  15.             }     
  16.           }     
  17.         }     
  18.     
  19.         // Get Results     
  20.         int resultsFetched = 0;     
  21.         while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults); && rs.next();); {     
  22.           Object[] columnValues = resultMap.resolveSubMap(request, rs);.getResults(request, rs);;     
  23.           callback.handleResultObject(request, columnValues, rs);;     
  24.           resultsFetched++;     
  25.         }     
  26.       }     
  27.     } finally {     
  28.       request.setResultSet(null);;     
  29.     }     
  30.   }   

返回的PaginatedList实际上是PaginatedDataList类的对象,每次翻页的时候最后都会调用

Java代码

  1. private List getList(int idx, int localPageSize); throws SQLException {     
  2.    return sqlMapExecutor.queryForList(statementName, parameterObject, (idx); * pageSize, localPageSize);;     
  3.  } 

这个方法,可见iBATIS的分页机制要看jdbcDriver如何实现以及是否支持rs.absolute(skipResults)。

iBATIS分页的情况就介绍到这里,希望对你有所帮助。

【编辑推荐】

  1. Struts2.0+ibatis2.3整合实例实现服务层及 Struts
  2. Struts2.0+ibatis2.3整合实例实现UI层浅析
  3. iBATIS入门程序六大步详解
  4. iBATIS DAO事务浅析
  5. iBATIS使用$和#的一些理解
责任编辑:仲衡 来源: JavaEye
相关推荐

2009-07-21 09:29:27

iBATIS使用

2022-12-27 09:56:34

架构系统

2012-06-15 11:02:31

架构师

2017-04-08 17:12:36

设计模式抽象策略模式

2013-08-21 13:47:29

PhoneUDIDUUID

2022-09-01 11:02:42

前端工具

2013-07-18 16:16:51

2009-12-01 09:06:36

VS2003 ajax

2009-07-17 09:24:45

iBATIS分页

2009-07-20 16:18:54

iBatis分页Hibernate式的

2009-11-27 13:04:16

VS2005远程调试

2020-09-29 10:42:30

kurbernetes开发云原生

2017-04-19 11:15:01

Oracle数据库备份恢复

2020-02-03 16:03:36

疫情思考

2010-09-28 14:14:19

SQL语句

2011-06-01 16:50:21

JAVA

2009-06-25 09:50:32

JSF

2009-06-18 14:54:52

Spring AOP

2013-07-02 09:43:02

编程策略

2009-09-21 17:46:25

Hibernate数据
点赞
收藏

51CTO技术栈公众号