[Java][MyBatis]物理分页实现(二)

2014-11-24 07:11:20 · 作者: · 浏览: 9
StringBuffer sbSql = new StringBuffer(); // 重写sql Configuration configuration = (Configuration)metaStatementHandler.getValue("delegate.configuration"); DBUtil dbUtil = new DBUtil(configuration); if(dbUtil.isMySQL()){ sbSql.append(sql).append(" LIMIT ").append(rowBounds.getOffset()).append(", ").append(rowBounds.getLimit()); metaStatementHandler.setValue("delegate.boundSql.sql", sbSql.toString()); // 采用物理分页后,就不需要mybatis的内存分页了,所以重置下面的两个参数 metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET); metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT); } else if(dbUtil.isOracle()){ sbSql.append("SELECT * "); sbSql.append(" FROM (SELECT ROWNUM RN, NOPAGESQL.* "); sbSql.append(" FROM (").append(sql).append(") NOPAGESQL "); sbSql.append(" WHERE ROWNUM <= ").append(rowBounds.getLimit()+rowBounds.getOffset()).append(")"); sbSql.append(" WHERE RN >= ").append(rowBounds.getOffset()); metaStatementHandler.setValue("delegate.boundSql.sql", sbSql.toString()); // 采用物理分页后,就不需要mybatis的内存分页了,所以重置下面的两个参数 metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET); metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT); } else { } // 将执行权交给下一个拦截器 return invocation.proceed(); } @Override public Object plugin(Object target) { // 当目标类是StatementHandler类型时,才包装目标类,否者直接返回目标本身,减少目标被代理的次数 if (target instanceof StatementHandler) { return Plugin.wrap(target, this); } else { return target; } } @Override public void setProperties(Properties properties) { // TODO Auto-generated method stub } }

2、配置读取类

/**
 * 版权所有:华信软件
 * 项目名称:ACWS框架类
 * 创建者: Wangdf
 * 创建日期: 2014-4-2
 * 文件说明: ACWS框架
数据库相关工具类 */ package framework.core.util; import org.apache.commons.lang.StringUtils; import org.apache.ibatis.session.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * ACWS框架数据库相关工具类 * @author Wangdf */ public class DBUtil { private static final String DBTYPE_MYSQL = "MySQL";//支持的类型:MySQL,Oracle private static final String DBTYPE_ORACLE = "Oracle";//支持的类型:MySQL,Oracle private static Logger logger = LoggerFactory.getLogger(DBUtil.class); private Configuration configuration = null; private String dbType = ""; private String defaultDateFormat = ""; public DBUtil(Configuration configuration){ if(configuration == null){ logger.error("系统启动失败:MyBatis Configuration 对象为空!"); throw new IllegalArgumentException("系统启动失败:MyBatis Configuration 对象为空!"); } this.configuration = configuration; this.dbType = this.configuration.getVariables().getProperty("dbtype"); if(StringUtils.isBlank(dbType)){ logger.error("数据库类型没有配置!"); } else { logger.info("数据库类型为:"+dbType); } this.defaultDateFormat = this.configuration.getVariables().getProperty("defaultDateFormat"); if(StringUtils.isBlank(this.defaultDateFormat)){ this.defaultDateFormat="yyyy-MM-dd"; logger.info("数据库日期默认格式字符串没有指定!系统默认为:yyyy-MM-dd"); } else { logger.info("数据库日期默认格式字符串:"+this.defaultDateFormat); } } /** * 判断是否是Oracle数据库 * @return * @author wangdf */ public boolean isO