修改ibatis源码实现物理分页

时间:2022-01-09 20:08:23

 注:本例子针对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改成其他数据库的分页处理就可以了。