修改ibatis源码实现物理分页

 注:本例子针对ibatis-2.3.2.715版本修改,其他版本不一定可以使用,但原理应该一样。并且数据库针对oracle,如果是其他数据库请修改源代码中的sql文部分。

ibatis这个orm工具非常小巧而且易于使用,但是在分页的处理上,它是把所有的数据取出来后,再所有结果集的基础上进行分页,如果数据量很大的话,效率是个问题。所以为了使它能够适应我们的需求,修改了一下源代码,实现用sql分页

1.首先找到com.ibatis.sqlmap.engine.mapping.statement.MappedStatement类
找到184行,String sqlString = sql.getSql(statementScope, parameterObject);
在这一行的后面加上一下代码

      if (SqlExecutor.NO_SKIPPED_RESULTS == skipResults && SqlExecutor.NO_MAXIMUM_RESULTS == maxResults){

      }else{
    StringBuilder sb = new StringBuilder();
  sb.append("SELECT * FROM ");
  sb.append(" ( ");
  sb.append(" SELECT A.*, rownum r ");
  sb.append(" FROM");
  sb.append("  ( ");

  sb.append(sqlString);

  sb.append("  ) A ");
  sb.append(" WHERE rownum <= "+(skipResults + maxResults));
  sb.append(" ) B ");
  sb.append(" WHERE r > "+skipResults);

  sqlString = sb.toString();
      }

2.然后找到com.ibatis.sqlmap.engine.execution.SqlExecutor类的189行
把 rs = handleMultipleResults(ps, statementScope, skipResults, maxResults, callback);
改为 rs = handleMultipleResults(ps, statementScope, 0, maxResults, callback);

改完后打包测试,应该没问题了。我没有具体测试,但原理就是如此,很简单,如果是其他数据库,把sql改成其他数据库的分页处理就可以了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值