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