package com.iformall.plugin; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import org.apache.ibatis.session.ResultHandler; import com.iformall.plugin.entity.ChainValue; import java.sql.Connection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** *共享数据库的多租户系统实现 * Created by Stormeye on 2018/10/22. */ @Intercepts({ //@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), //@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}) @Signature( method = "prepare", type = StatementHandler.class,args = {Connection.class, Integer.class}), @Signature(method = "query", type = StatementHandler.class, args = {java.sql.Statement.class, ResultHandler.class}) }) public class MyBatisItercepters implements Interceptor { private List plugins; public MyBatisItercepters(){ } public void setPlugins(List plugins) { this.plugins = plugins; } public Object intercept(Invocation invocation) throws Throwable { if (null != plugins && plugins.size() > 0 ) { // 能从cookie或者session获取到tenantId Map chainValues = new HashMap(); for (int i = 0 ; i < plugins.size() ; i++) { MyBatisPlus plug = plugins.get(i); invokeIntercept(plug, invocation, chainValues); } } return invocation.proceed(); } private void invokeIntercept(MyBatisPlus plug,Invocation invocation,Map chainMap) throws Throwable { Map resultMap = plug.intercept(invocation, chainMap); if (null != resultMap) { chainMap.putAll(resultMap); } } /** * 生成代理对象 * * @param target * @return */ @Override public Object plugin(Object target) { if (target instanceof StatementHandler) { return Plugin.wrap(target, this); } else { return target; } } }