MyBatis分页,自动总行数统计及Object[]数据结果(不修改源码)

 

 

原文查看http://www.cnblogs.com/jcli/archive/2011/08/09/2132222.html

将PaginationInterceptor稍作改进如下:

 

 

 

package com.sxf.mybatis.page;

import java.sql.Connection;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.RowBounds;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.MySQL5Dialect;

/**
 * MyBatis根据dialect分页(需要hibernate支持):数据库分页
 * 
 * @author 
 * 
 */
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) })
public class PaginationInterceptor implements Interceptor {

	private final static Log log = LogFactory
			.getLog(PaginationInterceptor.class);

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		StatementHandler statementHandler = (StatementHandler) invocation
				.getTarget();
		BoundSql boundSql = statementHandler.getBoundSql();
		MetaObject metaStatementHandler = MetaObject
				.forObject(statementHandler);
		RowBounds rowBounds = (RowBounds) metaStatementHandler
				.getValue("delegate.rowBounds");
		if (rowBounds == null || rowBounds == RowBounds.DEFAULT) {
			return invocation.proceed();
		}
		Configuration configuration = (Configuration) metaStatementHandler
				.getValue("delegate.configuration");
		String databaseType = null;
		try {
			databaseType = configuration.getVariables().getProperty("dialect")
					.toUpperCase();
		} catch (Exception e) {
			// ignore
		}

		if (databaseType == null) {
			throw new RuntimeException(
					"the value of the dialect property in configuration.xml is not defined : "
							+ configuration.getVariables().getProperty(
									"dialect"));
		}
		Dialect dialect = null;
		if ("MySQL".equalsIgnoreCase(databaseType)) {
			dialect = new MySQL5Dialect();
		} else if ("MySQL5InnoDB".equalsIgnoreCase(databaseType)) {
			dialect = new MySQL5InnoDBDialect();
		} else if ("MySQLMyISAM".equalsIgnoreCase(databaseType)) {
			dialect = new MySQLMyISAMDialect();
		} else if ("ORACLE9I".equalsIgnoreCase(databaseType)) {
			dialect = new Oracle9iDialect();
		} else if ("ORACLE10g".equalsIgnoreCase(databaseType)) {
			dialect = new Oracle10gDialect();
		} else if ("SqlServer2005".equalsIgnoreCase(databaseType)) {
			dialect = new SQLServer2005Dialect();
		} else if ("SqlServer2008".equalsIgnoreCase(databaseType)) {
			dialect = new SQLServer2008Dialect();
		} else if ("SqlServer".equalsIgnoreCase(databaseType)) {
			dialect = new SQLServerDialect();
		}

		if (rowBounds.getLimit() > 0
				&& rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT) {

			String originalSql = (String) metaStatementHandler
					.getValue("delegate.boundSql.sql");

			String desSql = dialect.getLimitString(originalSql,
					rowBounds.getOffset(), rowBounds.getLimit());

			metaStatementHandler.setValue("delegate.boundSql.sql", desSql);

			String addSql = desSql.replace(originalSql, "");

			Pattern pattern = Pattern.compile("[?]");
			Matcher matcher = pattern.matcher(addSql);
			int size = 0;
			while (matcher.find()) {
				size++;
			}

			if (size == 1) {
				ParameterMapping.Builder builder = new ParameterMapping.Builder(
						configuration, "limit", Integer.class);
				boundSql.getParameterMappings().add(builder.build());
				boundSql.setAdditionalParameter("limit", rowBounds.getLimit());
			}
			if (size == 2) {

				ParameterMapping.Builder builder = new ParameterMapping.Builder(
						configuration, "offset", Integer.class);
				boundSql.getParameterMappings().add(builder.build());
				boundSql.setAdditionalParameter("offset", rowBounds.getOffset());

				builder = new ParameterMapping.Builder(configuration, "limit",
						Integer.class);
				boundSql.getParameterMappings().add(builder.build());
				boundSql.setAdditionalParameter("limit", rowBounds.getLimit());
			}

			metaStatementHandler.setValue("delegate.rowBounds.offset",
					RowBounds.NO_ROW_OFFSET);
			metaStatementHandler.setValue("delegate.rowBounds.limit",
					RowBounds.NO_ROW_LIMIT);

			if (log.isDebugEnabled()) {
				log.debug("生成分页SQL : " + boundSql.getSql());
			}
		}
		return invocation.proceed();
	}

	@Override
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);

	}

	@Override
	public void setProperties(Properties properties) {

	}

}

 此处分页需要Hibernate的jar包的dialect支持.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值