package cn.org.rapid_framework.ibatis.sqlmap.engine.execution; import java.sql.Connection; import java.sql.SQLException; import cn.org.rapid_framework.jdbc.dialect.Dialect; import com.ibatis.sqlmap.engine.execution.SqlExecutor; import com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback; import com.ibatis.sqlmap.engine.scope.StatementScope; /** * 结合dialect为ibatis提供使用数据库原生的分页 * 请查看:http://pengfeng.javaeye.com/blog/200772 * @author badqiu * */ public class LimitSqlExecutor extends SqlExecutor { private Dialect dialect; private boolean enableLimit = true; public Dialect getDialect() { return dialect; } public void setDialect(Dialect dialect) { if(dialect != null) { System.out.println("[iBATIS] set ibatis LimitSqlExecutor.dialect = "+dialect.getClass().getName()); } this.dialect = dialect; } public boolean isEnableLimit() { return enableLimit; } public void setEnableLimit(boolean enableLimit) { this.enableLimit = enableLimit; } @Override public void executeQuery(StatementScope statementScope, Connection conn, String sql, Object[] parameters, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException { if (supportsLimit() && (skipResults != NO_SKIPPED_RESULTS || maxResults != NO_MAXIMUM_RESULTS)) { sql = sql.trim(); if(dialect.supportsLimitOffset()) { sql = dialect.getLimitString(sql, skipResults, maxResults); skipResults = NO_SKIPPED_RESULTS; }else { sql = dialect.getLimitString(sql, 0, maxResults); } maxResults = NO_MAXIMUM_RESULTS; } super.executeQuery(statementScope, conn, sql, parameters, skipResults, maxResults, callback); } public boolean supportsLimit() { if (enableLimit && dialect != null) { return dialect.supportsLimit(); } return false; } }