iBATIS分页源码真相探讨

iBATIS分页源码真相的探讨,首先我们在iBATIS中有一个很吸引人的方法,queryForPaginatedList(java.lang.String id, int pageSize),可以返回 PaginatedList的对象,实现翻页,刚才测试了一下PaginatedList,在1-2w行数据的时候还可以工作,但是在一个30w行的表里翻页,一次select用了363.031second忍不住看了一下源,发现iBATIS的分页依赖于数据库的JDBC Driver.

善左ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!

调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList

->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList

->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback

->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()

iBATIS分页处理的函数如下

 
 
 
  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.  
  10.  
  11.             rs.absolute(skipResults);  
  12.           }  
  13.         } else {  
  14.           for (int i = 0; i < skipResults; i++) {  
  15.             if (!rs.next()) {  
  16.               return;  
  17.             }  
  18.           }  
  19.         }   
  20.  
  21.  
  22.         // Get Results  
  23.         int resultsFetched = 0;  
  24.         while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) {  
  25.           Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs);  
  26.           callback.handleResultObject(request, columnValues, rs);  
  27.           resultsFetched++;  
  28.         }  
  29.       }  
  30.     } finally {  
  31.       request.setResultSet(null);  
  32.     }  
  33.   } 

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

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

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

这种实现肯定不如数据库自己支持的分页方式来的快,一旦碰到数据量大的表,有停滞的可能。

iBATIS分页的源码分析就到这里,希望你能对iBATIS分页的根本有所了解。

【编辑推荐】

  1. iBATIS发展方向的四方面浅析
  2. iBATIS快速创建应用浅析
  3. iBATIS配置浅析
  4. iBATIS测试类的详细写法
  5. iBATIS使用之高级查询技术详解

网站栏目:iBATIS分页源码真相探讨
文章分享:http://www.shufengxianlan.com/qtweb/news33/265283.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联