首页>代码>spring+Spring MVC+ MyBatis+apache shiro开发ssm网站后台权限管理系统>/easyee-sm/src/main/java/cn/easyproject/easyee/sm/base/pagination/EasyMybatisPaginationPlugin.java
package cn.easyproject.easyee.sm.base.pagination;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
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.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * EasyMyBatis Pagination plugin
 * 
 * <pre>
 * <code>
 * 	&lt;plugins&gt;
 *		 &lt;plugin interceptor="cn.easyproject.easymybatis.pagination.EasyMybatisPaginationPlugin"&gt;
 *		 		&lt;!-- required; ORACLE, ORACLE_12C, SQLSERVER, SQLSERVER_2012, MYSQL --&gt;
 *		 		&lt;property name="dialect" value="MYSQL"/&gt;
 *		 &lt;/plugin&gt;
 *	&lt;/plugins&gt;
 * </code>
 * </pre>
 * 
 * @author Ray
 * @author inthinkcolor@gmail.com
 * @author easyproject.cn
 * @see https://github.com/ushelp/EasyMyBatisPagination
 * @since 1.0.0
 */
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }),
		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
				RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class }),
		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
				RowBounds.class, ResultHandler.class }) })
public class EasyMybatisPaginationPlugin implements Interceptor {

	public static Logger logger = LoggerFactory.getLogger(EasyMybatisPaginationPlugin.class);

	private int dialect = -1;

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Object intercept(Invocation invocation) throws Throwable {
		if (invocation.getTarget() instanceof StatementHandler) {
			RoutingStatementHandler statementHandler = (RoutingStatementHandler) invocation.getTarget();
			Object args = statementHandler.getBoundSql().getParameterObject();
			if (args != null && args.getClass().equals(PageBean.class)) {
				PageBean pb = (PageBean) args;
				Connection connection = (Connection) invocation.getArgs()[0];
				PreparedStatement pstmt = null;
				ResultSet rs = null;
				try {
					pstmt = connection
							.prepareStatement(pb.getAutoCountSQL().replaceAll("\\#\\{[\\ ]*(\\S*)[\\ ]*\\}", "?"));
					statementHandler.parameterize(pstmt);
					rs = pstmt.executeQuery();
					if (rs.next()) {
						int totalRecord = rs.getInt(1);
						pb.setRowsCount(totalRecord);
					}
				} catch (SQLException e) {
					e.printStackTrace();
				} finally {
					try {
						if (rs != null)
							rs.close();
						if (pstmt != null)
							pstmt.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
				// Statement statement = statementHandler.prepare(connection,
				// transactionTimeout);
				// statementHandler.parameterize(statement);
				// List list = statementHandler.query(statement, null);
				// pb.setData(list);
			}
			Object result = invocation.proceed();
			return result;
		} else if (invocation.getTarget() instanceof Executor) {
			if (invocation.getArgs() != null && invocation.getArgs().length > 2 && invocation.getArgs()[1] != null
					&& invocation.getArgs()[1].getClass().equals(PageBean.class)) {
				// Pagination
				PageBean pb = (PageBean) invocation.getArgs()[1];
				Executor ex = (Executor) invocation.getTarget();
				Connection connection = (Connection) ex.getTransaction().getConnection();

				// if not set dialect
				if (pb.getDialect() == -1) {
					// check default dialect parameter
					if (dialect == -1) {
						// Auto Identification dialect
						DatabaseMetaData dbmd = connection.getMetaData();
						String productName = dbmd.getDatabaseProductName().replace(" ", "").toLowerCase();
						String version = dbmd.getDriverVersion().replace(" ", "").toLowerCase();

						if (productName.contains("oracle") && version.startsWith("12.")) {
							dialect = PageBean.ORACLE_12C_DIALECT;
						} else if (productName.contains("oracle")) {
							dialect = PageBean.ORACLE_DIALECT;
						} else if (productName.contains("mysql")) {
							dialect = PageBean.MYSQL_DIALECT;
						} else if (productName.contains("sqlserver") && version.startsWith("sqlserver2012")) {
							dialect = PageBean.SQLSERVER_2012_DIALECT;
						} else if (productName.contains("sqlserver")) {
							dialect = PageBean.SQLSERVER_DIALECT;
						} else {
							throw new EasyMyBatisPaginationException("Sorry, the database '"
									+ dbmd.getDatabaseProductName()
									+ "' now not support(Only support: oracle12c, oracle, sqlserver2012, sqlserver, mysql). Please contact 'inthinkcolor@gmail.com' or edit source code write yourself support!");
						}

					}

					pb.setDialect(dialect);
				}
			}

			Object result = invocation.proceed();

			if (invocation.getArgs() != null && invocation.getArgs().length > 2 && invocation.getArgs()[1] != null
					&& invocation.getArgs()[1].getClass().equals(PageBean.class)) {
				// Pagination
				PageBean pb = (PageBean) invocation.getArgs()[1];
				pb.setData((List) result);
			}
			return result;
		} else {
			return invocation.proceed();
		}
	}

	public Object plugin(Object target) {
		if (target instanceof StatementHandler) {
			return Plugin.wrap(target, this);
		} else if (target instanceof Executor) {
			return Plugin.wrap(target, this);
		} else {
			return target;
		}
	}

	public void setProperties(Properties properties) {
		Object dialectValue = properties.get("dialect");
		if (dialectValue == null) {
			logger.warn("EasyMyBatisPagination - the defualt 'dialect' parameter is not set!");
			return;
		}
		String dialectValueStr = dialectValue.toString();
		if (dialectValueStr.equalsIgnoreCase("ORACLE")) {
			dialect = PageBean.ORACLE_DIALECT;
		} else if (dialectValueStr.equalsIgnoreCase("ORACLE_12C")) {
			dialect = PageBean.ORACLE_12C_DIALECT;
		} else if (dialectValueStr.equalsIgnoreCase("SQLSERVER")) {
			dialect = PageBean.SQLSERVER_DIALECT;
		} else if (dialectValueStr.equalsIgnoreCase("SQLSERVER_2012")) {
			dialect = PageBean.SQLSERVER_2012_DIALECT;
		} else if (dialectValueStr.equalsIgnoreCase("MYSQL")) {
			dialect = PageBean.MYSQL_DIALECT;
		} else {
			logger.warn("EasyMyBatisPagination - Unkonw defualt 'dialect' parameter value '" + dialectValueStr + "'!");
			// throw new EasyMyBatisPaginationException("the dialect '" +
			// dialect + "' unkonw!");
		}
	}
}
最近下载更多
wuying8208  LV15 2023年11月25日
vitos5n  LV9 2022年9月13日
15827485252  LV19 2022年3月31日
00044304  LV6 2021年9月16日
jerywang  LV9 2021年3月7日
一只勤奋的猪猪  LV9 2021年2月27日
ghost_M  LV7 2021年1月7日
q59200182  LV9 2020年8月19日
13043860zj  LV16 2020年8月10日
CSS199669  LV25 2020年7月23日
最近浏览更多
educationAAA  LV2 4月18日
xuweiwowzy  LV5 1月14日
gnnhka  LV10 2023年12月26日
549472416 2023年12月7日
暂无贡献等级
wuying8208  LV15 2023年11月25日
马宇轩  LV1 2023年11月19日
oulingqiao  LV13 2023年10月17日
空心菜4  LV9 2023年7月14日
sjl821120  LV6 2023年6月10日
森sdfgf  LV8 2023年6月9日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友