diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java index 46bf7c221..2950d986b 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java @@ -89,6 +89,7 @@ public class WxCUserServiceImpl implements WxCUserService { user.setId(oldUser.getId()); user.setLoginCount(oldUser.getLoginCount()==null?0:oldUser.getLoginCount() + 1); user.setUpdateDate(curr); + user.updateTenantInfo(oldUser); // TODO 是否其他信息需要更新 ret = wxCUserMapper.updateById(user); return ret; diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisItercepters.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisItercepters.java index ed851a802..3f0daeee2 100644 --- a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisItercepters.java +++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisItercepters.java @@ -4,7 +4,9 @@ import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import org.apache.ibatis.session.ResultHandler; import java.sql.Connection; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *共享数据库的多租户系统实现 * Created by Stormeye on 2018/10/22. @@ -29,12 +31,21 @@ public class MyBatisItercepters implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { if (null != plugins && plugins.size() > 0 ) { // 能从cookie或者session获取到tenantId - for (MyBatisPlus plug: plugins) { - plug.intercept(invocation); + Map chainMap = new HashMap(); + for (int i = 0 ; i < plugins.size() ; i++) { + MyBatisPlus plug = plugins.get(i); + invokeIntercept(plug, invocation, chainMap); } } 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); + } + } /** * 生成代理对象 diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisPlus.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisPlus.java index 566476f2a..d3056d9d4 100644 --- a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisPlus.java +++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/MyBatisPlus.java @@ -1,8 +1,15 @@ package com.iformall.plugin; +import java.util.Map; + import org.apache.ibatis.plugin.Invocation; public interface MyBatisPlus { - public void intercept(Invocation invocation) throws Throwable; + /** + * @param invocation + * @return Map + * @throws Throwable + */ + public Map intercept(Invocation invocation,Map parentChainMap) throws Throwable; } diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/autoTenantId/MultiTenancy.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/autoTenantId/MultiTenancy.java index 9989fc104..b48ef9364 100644 --- a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/autoTenantId/MultiTenancy.java +++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/autoTenantId/MultiTenancy.java @@ -36,7 +36,9 @@ import com.iformall.plugin.MyBatisPlus; import java.sql.Connection; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; /** @@ -87,11 +89,17 @@ public class MultiTenancy implements MyBatisPlus { public MultiTenancy(){ } - public void intercept(Invocation invocation) throws Throwable { + @Override + public Map intercept(Invocation invocation,Map parentChainMap) throws Throwable { if (getTenantInfo().getTenantId() != null || getTenantInfo().getParentTenantId() != null) { // 能从cookie或者session获取到tenantId mod(invocation); + Map resultMap = new HashMap(); + resultMap.put(tenantIdColumn, getTenantInfo().getTenantId()); + resultMap.put(parentTenantIdColumn, getTenantInfo().getParentTenantId()); + return resultMap; } + return null; } /** diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/plugin/ShardingSpherePlugin.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/plugin/ShardingSpherePlugin.java index 6691e3fd6..b95820661 100644 --- a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/plugin/ShardingSpherePlugin.java +++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/plugin/ShardingSpherePlugin.java @@ -74,9 +74,9 @@ public class ShardingSpherePlugin implements MyBatisPlus { } } - public void intercept(Invocation invocation) throws Throwable { + public Map intercept(Invocation invocation,Map parentChainMap) throws Throwable { if (!ShardingTableExcuter.hasShardingConfig()) { - return ; + return parentChainMap; } StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); @@ -92,29 +92,31 @@ public class ShardingSpherePlugin implements MyBatisPlus { // if (null == ignore) { Object parameterObject = metaStatementHandler.getValue("delegate.boundSql.parameterObject"); BoundSql boundSql = statementHandler.getBoundSql(); - String newSQL = buildTable(boundSql,parameterObject); + String newSQL = buildTable(boundSql,parameterObject,parentChainMap); metaStatementHandler.setValue("delegate.boundSql.sql", newSQL); // } //} + //没有添加字段,只是根据字段分表,没有别的需要返回 + return parentChainMap; } - private String buildTable(BoundSql boundSql,Object parameterObject) throws JSQLParserException { + private String buildTable(BoundSql boundSql,Object parameterObject,Map parentChainMap) throws JSQLParserException { String oldSql = boundSql.getSql(); Statement stmt = CCJSqlParserUtil.parse(oldSql); if (stmt instanceof Insert) { - return buildInsert((Insert) stmt,oldSql,parameterObject); + return buildInsert((Insert) stmt,oldSql,parameterObject,parentChainMap); } if (stmt instanceof Delete) { - return buildDelete((Delete) stmt,oldSql,parameterObject); + return buildDelete((Delete) stmt,oldSql,parameterObject,parentChainMap); } if (stmt instanceof Update) { - return buildUpdate((Update) stmt,oldSql,parameterObject); + return buildUpdate((Update) stmt,oldSql,parameterObject,parentChainMap); } if (stmt instanceof Select) { - return buildSelect((Select) stmt,oldSql,parameterObject); + return buildSelect((Select) stmt,oldSql,parameterObject,parentChainMap); } if (stmt instanceof CreateTable) { @@ -123,86 +125,115 @@ public class ShardingSpherePlugin implements MyBatisPlus { throw new RuntimeException("非法sql语句,请检查"+oldSql); } - private String buildInsert(Insert stmt,String oldSql,Object parameterObject) { - return buildTable(stmt.getTable(), oldSql, parameterObject); + private String buildInsert(Insert stmt,String oldSql,Object parameterObject,Map parentChainMap) { + return buildTable(stmt.getTable(), oldSql, parameterObject,parentChainMap); } - private String buildDelete(Delete stmt,String oldSql,Object parameterObject) { - return buildTable(stmt.getTable(), oldSql, parameterObject); + private String buildDelete(Delete stmt,String oldSql,Object parameterObject,Map parentChainMap) { + return buildTable(stmt.getTable(), oldSql, parameterObject,parentChainMap); } - private String buildUpdate(Update stmt,String oldSql,Object parameterObject) { - return buildListTables(stmt.getTables(), oldSql, parameterObject); + private String buildUpdate(Update stmt,String oldSql,Object parameterObject,Map parentChainMap) { + return buildListTables(stmt.getTables(), oldSql, parameterObject,parentChainMap); } - private String buildSelect(Select stmt,String oldSql,Object parameterObject) { + private String buildSelect(Select stmt,String oldSql,Object parameterObject,Map parentChainMap) { TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); List tableList = tablesNamesFinder.getTableList(stmt); - return buildByListTableNames(tableList, oldSql, parameterObject); + return buildByListTableNames(tableList, oldSql, parameterObject,parentChainMap); } - private String buildTable(Table table,String oldSql,Object parameterObject) { - return buildByTableName(table.getName(), oldSql, parameterObject); + private String buildTable(Table table,String oldSql,Object parameterObject,Map parentChainMap) { + return buildByTableName(table.getName(), oldSql, parameterObject,parentChainMap); } - private String buildByTableName(String table,String oldSql,Object parameterObject) { + private String buildByTableName(String table,String oldSql,Object parameterObject,Map parentChainMap) { if (!ShardingTableExcuter.isShardingTable(table)) { return oldSql; } - String newtable = getShareTable(table,parameterObject); + String newtable = getShareTable(table,parameterObject,parentChainMap); //此处处理前缀相似的表,如wx_c_user, wx_c_user_basic_info, 直接替换wx_c_user会有问题 return oldSql.replaceAll(table+"_", "########").replaceAll(table, newtable).replaceAll("########", table+"_"); } - private String buildListTables(List tables,String oldSql,Object parameterObject) { + private String buildListTables(List
tables,String oldSql,Object parameterObject,Map parentChainMap) { for (Table t : tables) { - oldSql = buildTable(t,oldSql,parameterObject); + oldSql = buildTable(t,oldSql,parameterObject,parentChainMap); } return oldSql; } - private String buildByListTableNames(List tables,String oldSql,Object parameterObject) { + private String buildByListTableNames(List tables,String oldSql,Object parameterObject,Map parentChainMap) { for (String t : tables) { - oldSql = buildByTableName(t,oldSql,parameterObject); + oldSql = buildByTableName(t,oldSql,parameterObject,parentChainMap); } return oldSql; } - private String getShareTable(String table,Object parameterObject) { + private String getShareTable(String table,Object parameterObject,Map parentChainMap) { ShardingSphere ss = ShardingTableExcuter.getShardingSphere(table); - return ss.getTableName()+ShardingSphere.TABLE_SUFFIX+ShardingRuleExcuter.getTableIndex(ss.getRule(), getValue(ss.getColumn(),parameterObject), ss.getCount()); + return ss.getTableName()+ShardingSphere.TABLE_SUFFIX+ShardingRuleExcuter.getTableIndex(ss.getRule(), getValue(ss.getColumn(),parameterObject,parentChainMap), ss.getCount()); } - private Object getValue(String column,Object parameterObject) { + private Object getValue(String column,Object parameterObject,Map parentChainMap) { + if (null != parentChainMap && parentChainMap.containsKey(column)) { + return parentChainMap.get(column); + } + if (parameterObject instanceof Map) { - return ((Map) parameterObject).get(column); - }else if (parameterObject instanceof Integer || parameterObject instanceof Long || parameterObject instanceof Short || parameterObject instanceof Float - || parameterObject instanceof Double || parameterObject instanceof BigDecimal || parameterObject instanceof Character || parameterObject instanceof String - || parameterObject instanceof Byte || parameterObject instanceof Date || parameterObject instanceof Time || parameterObject instanceof Timestamp) { + String field = getField(column); + field = field.substring(0,1).toLowerCase()+field.substring(1); + Object o = parameterObject; + if (((Map) parameterObject).containsKey("et")) { + o = ((Map) parameterObject).get("et"); + }else if(((Map) parameterObject).containsKey(column)) { + o = ((Map) parameterObject).get(column); + }else if (((Map) parameterObject).containsKey(field)) { + o = ((Map) parameterObject).get(column); + } + return getValue(column,o,parentChainMap); + }else if (isBasicTypeValue(parameterObject)) { return parameterObject; //认为是实体 }else { - try { - String[] field = column.split("_"); - String fieldName = ""; - if (null != field && field.length > 0) { - for (String f : field) { - fieldName = fieldName + f.substring(0,1).toUpperCase()+f.substring(1); - } - }else { - fieldName = column.substring(0,1).toUpperCase()+column.substring(1); - } - - Method method = getMethodFromAllParent(parameterObject.getClass(),"get"+fieldName); - Object o = method.invoke(parameterObject); - return o; - }catch(Exception e) { - e.printStackTrace(); - return parameterObject; - } + return getEntityValue(column, parameterObject, parentChainMap); } } + private String getField(String column) { + String[] field = column.split("_"); + String fieldName = ""; + if (null != field && field.length > 0) { + for (String f : field) { + fieldName = fieldName + f.substring(0,1).toUpperCase()+f.substring(1); + } + }else { + fieldName = column.substring(0,1).toUpperCase()+column.substring(1); + } + return fieldName; + } + + private boolean isBasicTypeValue(Object parameterObject) { + if( parameterObject instanceof Integer || parameterObject instanceof Long || parameterObject instanceof Short || parameterObject instanceof Float + || parameterObject instanceof Double || parameterObject instanceof BigDecimal || parameterObject instanceof Character || parameterObject instanceof String + || parameterObject instanceof Byte || parameterObject instanceof Date || parameterObject instanceof Time || parameterObject instanceof Timestamp ) { + return true; + } + return false; + } + + private Object getEntityValue(String column,Object parameterObject,Map parentChainMap) { + try { + Method method = getMethodFromAllParent(parameterObject.getClass(),"get"+getField(column)); + Object o = method.invoke(parameterObject); + return o; + }catch(Exception e) { + e.printStackTrace(); + return parameterObject; + } + } + + private Method getMethodFromAllParent(Class currentClazz,String methodName) { Method method = null; for(Class clazz = currentClazz ; clazz != Object.class ; clazz = clazz.getSuperclass()) {