`
fengpeng
  • 浏览: 102501 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis分页源码分析

阅读更多
关键字:   ibatis    

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

调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
分页处理的函数如下

代码
  1. private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {   
  2.   
  3.     try {   
  4.   
  5.       request.setResultSet(rs);   
  6.   
  7.       ResultMap resultMap = request.getResultMap();   
  8.   
  9.       if (resultMap != null) {   
  10.   
  11.         // Skip Results   
  12.   
  13.         if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {   
  14.   
  15.           if (skipResults > 0) {   
  16.   
  17.             rs.absolute(skipResults);   
  18.   
  19.           }   
  20.   
  21.         } else {   
  22.   
  23.           for (int i = 0; i < skipResults; i++) {   
  24.   
  25.             if (!rs.next()) {   
  26.   
  27.               return;   
  28.   
  29.             }   
  30.   
  31.           }   
  32.   
  33.         }   
  34.   
  35. // Get Results   
  36. int resultsFetched = 0;   
  37. while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) {   
  38. Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs);   
  39. callback.handleResultObject(request, columnValues, rs);   
  40. resultsFetched++;   
  41. }   
  42. }   
  43. finally {   
  44. request.setResultSet(null);   
  45. }   
  46. }    
<script>render_code();</script>
返回的PaginatedList实际上是PaginatedDataList类的对象,每次翻页的时候最后都会调用
代码
  1. private List getList(int idx, int localPageSize) throws SQLException {   
  2.   
  3.     return sqlMapExecutor.queryForList(statementName, parameterObject, (idx) * pageSize, localPageSize);   
  4.   
  5.   }   
<script>render_code();</script>
这个方法,可见ibatis的分页机制要看jdbcDriver如何实现以及是否支持rs.absolute(skipResults)。
这种实现肯定不如数据库自己支持的分页方式来的快,一旦碰到数据量大的表,马上会死翘翘。
分享到:
评论

相关推荐

    ibatis 之分页

    6. **源码分析**:理解Ibatis的源码有助于我们更好地利用其分页功能。例如,查看Executor的执行过程,了解参数是如何传递到SQL中的,以及如何与数据库交互。 7. **工具辅助**:除了PageHelper,还有其他如MyBatis-...

    ibatis分页

    标题中的“ibatis分页”指的是在使用iBATIS(一个SQL映射框架)时,如何实现数据库查询结果的分页显示。...对于进阶学习者,深入源码分析将帮助理解iBATIS的内部工作流程,从而更好地进行定制和优化。

    传智ibatis视频源码

    7. **插件机制**:Ibatis允许开发者自定义插件,拦截SQL执行过程,实现如日志记录、性能分析等功能,扩展性极强。 8. **事务管理**:Ibatis支持手动和自动的事务管理,理解何时提交、回滚事务,以及事务的隔离级别...

    mybatis分页插件源码

    这个插件的源码分析可以帮助我们深入理解其工作原理,从而更好地利用它来优化应用性能。 首先,`pom.xml` 文件是 Maven 项目的核心配置文件,用于定义项目依赖和构建过程。在 MyBatis 分页插件的源码中,`pom.xml` ...

    spring-ibatis-ext-plugin.1.0.0 扩展ibaits原生SQL

    通过分析ibatis源码知道,最终负责执行sql的类是 com.ibatis.sqlmap.engine.execution.SqlExecutor,此类没有实现任何接口,这多少有点遗憾,因为接口是相对稳定契约,非大 的版本更新,接口一般是不会变的,而类...

    ibatis学习资料汇总

    源码分析可以帮助开发者更好地定制和优化自己的应用。 六、iBatis实践项目 通过实践项目,可以加深对iBatis的理解和掌握。你可以创建一个简单的CRUD(创建、读取、更新、删除)应用,或者参与更复杂的业务逻辑,如...

    ibatis-2-mybatis-2.3.5.zip

    四、源码分析 iBatis的核心源码中,SqlSessionManager是整个框架的入口,负责创建SqlSession对象并管理事务。Executor接口及其实现类(SimpleExecutor、ReuseExecutor、BatchExecutor)是执行SQL的关键。在执行SQL...

    iBATIS入门讲解和程序源码+iBATIS开发指南电子书

    源码分析部分,我们可以看到iBATIS如何解析XML配置文件,如何通过反射机制调用Java方法,以及如何将查询结果自动映射到Java对象上。这对于理解iBATIS的工作流程及其内部机制至关重要。 在"iBATIS开发指南电子书"中...

    一个用ibatis框架开发的示例项目

    通过分析和实践,我们可以掌握如何配置Ibatis,编写动态SQL,管理事务,以及如何在Spring环境中优雅地使用Ibatis。这不仅有助于我们提升开发效率,也能使我们在实际项目中更好地应对复杂的数据访问需求。

    扩展 iBatis 以透明支持多种数据库

    例如,MySQL 和 Oracle 在语法上有差异,如分页查询、日期处理等。通过创建和注册新的方言类,可以确保 SQL 能够正确地在不同数据库上执行。 2. **数据源配置**:为了支持多种数据库,需要在 iBatis 的配置文件中...

    springMVC+spring+hibernate+jquery分页完整项目,完整代码

    本项目是一个基于SpringMVC、Spring、Hibernate和jQuery的完整分页应用,涵盖了后端服务、数据持久化、前端交互等多个重要技术...开发者可以通过分析源码,了解如何在实际项目中运用这些技术,从而提升自己的技能水平。

    struts1 +ibatis +mysql 做的产品管理系统

    Struts1、iBatis和MySQL是Web应用开发...总的来说,这个基于Struts1、iBatis和MySQL的产品管理系统提供了全面的产品管理功能,其源码的完整性使得开发者可以直接借鉴和学习,了解如何将这些技术有效整合到实际项目中。

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 13.RPC底层通讯原理之Netty线程模型源码分析.wmv │ │ │ ├─14.分库分表之后分布式下如何保证ID全局唯一性 │ │ 14.分库分表之后分布式下如何保证ID全局唯一性.mp4 │ │ │ └─15.大型公司面试必答之...

    EAsyUI 学习

    在源码 _7609373.zip 中,你可以找到如何配置 DataGrid,以及实现分页功能的方法。了解 DataGrid 的基本使用和配置,能帮助你更好地展示和管理大量的结构化数据。 2. **EasyUI 项目实例** 文件 _7605957.zip 包含...

    .net源码生成工具DataBase2Sharp

     4、Web界面自动生成功能,生成列表、增加、修改界面代码和后台代码,包括烦琐的绑定数据和赋值语句代码,为你封装具有漂亮界面和布局的编辑、查看、添加和分页控件,随手可得,率性而为。  5、Enterprise Library...

    动力节点java课程.docx

    2. **Struts1**:了解其MVC架构,分析核心实现源码,学习ActionForm、ActionMapping等概念,以及国际化支持和Validator框架。 3. **Struts2**:对比Struts1,掌握Struts2的特性,如类型转换、拦截器、OGNL,以及与...

    struts项目1:网上企业办公自动化

    通过对源码的分析,开发者可以了解如何使用Struts2的注解来定义Action,如何处理表单提交,如何实现分页和搜索功能,以及如何进行错误和异常处理。此外,通过查看数据库设计,还可以了解到如何优化数据模型以满足...

Global site tag (gtag.js) - Google Analytics