From 3c5f942a1dce3f2dff1335d49565dde0160934f9 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Thu, 15 Oct 2020 11:17:29 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=88=86=E8=A1=A8bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iformall/config/MyBatisConfiguration.java | 2 +- .../iformall/config/MyBatisConfiguration.java | 2 +- .../iformall/config/MyBatisConfiguration.java | 2 +- .../config/BaseMyBatisConfiguration.java | 2 +- .../domain/po/base/BaseCUserEntity.java | 49 +++++++- .../domain/po/base/BaseTenantEntity.java | 25 +++- .../iformall/domain/po/base/TenantEntity.java | 21 +++- .../domain/po/base/TenantVEntity.java | 25 +++- .../shard/impl/ShardingTableExcuter.java | 1 - .../shard/plugin/ShardingSpherePlugin.java | 107 ++++++++++-------- 10 files changed, 167 insertions(+), 69 deletions(-) diff --git a/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java index 89166dfe2..4d2dd2336 100644 --- a/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java +++ b/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java @@ -14,7 +14,7 @@ public class MyBatisConfiguration extends BaseMyBatisConfiguration{ @Bean public MyBatisItercepters intercepters() { - return intercepters(); + return allIntercepters(); } @Bean diff --git a/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java index f8a99b142..850c5c826 100644 --- a/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java +++ b/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java @@ -10,6 +10,6 @@ public class MyBatisConfiguration extends BaseMyBatisConfiguration{ @Bean public MyBatisItercepters intercepters() { - return intercepters(); + return allIntercepters(); } } diff --git a/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java index e9bee80fb..af4d6009a 100644 --- a/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java +++ b/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java @@ -9,6 +9,6 @@ public class MyBatisConfiguration extends BaseMyBatisConfiguration { @Bean public MyBatisItercepters intercepters() { - return intercepters(); + return allIntercepters(); } } diff --git a/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java b/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java index 2b706db61..9083d471d 100644 --- a/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java +++ b/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java @@ -13,7 +13,7 @@ import com.iformall.plugin.shard.plugin.ShardingSpherePlugin; public class BaseMyBatisConfiguration { - protected MyBatisItercepters intercepters() { + protected MyBatisItercepters allIntercepters() { MyBatisItercepters intercepters = new MyBatisItercepters(); List plugins = new ArrayList(); plugins.add(multiTenancy()); diff --git a/mallinkService/src/main/java/com/iformall/domain/po/base/BaseCUserEntity.java b/mallinkService/src/main/java/com/iformall/domain/po/base/BaseCUserEntity.java index 3f3011954..5fcc9ac0a 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/base/BaseCUserEntity.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/base/BaseCUserEntity.java @@ -19,24 +19,23 @@ import java.util.UUID; * @author Stormeye * @date 2019/4/24 14:32 */ -@Data @EqualsAndHashCode(callSuper = true) public class BaseCUserEntity extends TenantEntity { protected Long id; @io.swagger.annotations.ApiModelProperty(value="userId",name="userId") - private Long userId; + protected Long userId; /*用户登录用token**/ @io.swagger.annotations.ApiModelProperty(value="用户登录用token",name="token") - private String token; + protected String token; /*用户过期时间**/ @io.swagger.annotations.ApiModelProperty(value="用户过期时间",name="expireTime") - private Date expireTime; + protected Date expireTime; @io.swagger.annotations.ApiModelProperty(value="真实对象如wxCUser",name="realUser") @TableField(exist = false) - private Object realUser; + protected Object realUser; /** * 是否是会员 @@ -45,4 +44,44 @@ public class BaseCUserEntity extends TenantEntity { public boolean basicInfoIs() { return UserUtil.CuserIsBasicInfo(this.getUserId()); } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Object getRealUser() { + return realUser; + } + + public void setRealUser(Object realUser) { + this.realUser = realUser; + } } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/base/BaseTenantEntity.java b/mallinkService/src/main/java/com/iformall/domain/po/base/BaseTenantEntity.java index 198712425..697b6b5e6 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/base/BaseTenantEntity.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/base/BaseTenantEntity.java @@ -12,16 +12,15 @@ import org.apache.commons.lang3.StringUtils; * @author Stormeye * @date 2019/4/24 14:32 */ -@Data @Slf4j @EqualsAndHashCode(callSuper = true) public class BaseTenantEntity extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") - private String tenantId; + protected String tenantId; @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value="父租户ID",name="parentTenantId") - private String parentTenantId; + protected String parentTenantId; @TableField(exist = false) @JsonProperty(access = JsonProperty.Access.READ_ONLY) @@ -47,4 +46,24 @@ public class BaseTenantEntity extends BaseEntity { setTenantId(tenantId); }}; } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getParentTenantId() { + return parentTenantId; + } + + public void setParentTenantId(String parentTenantId) { + this.parentTenantId = parentTenantId; + } + + public void setTenantInfo(TenantEntity tenantInfo) { + this.tenantInfo = tenantInfo; + } } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/base/TenantEntity.java b/mallinkService/src/main/java/com/iformall/domain/po/base/TenantEntity.java index 41fa0e75c..799dcd784 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/base/TenantEntity.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/base/TenantEntity.java @@ -10,16 +10,15 @@ import com.iformall.domain.po.WxCUserBasicInfo; * @author Stormeye * @date 2019/4/24 14:32 */ -@Data @EqualsAndHashCode(callSuper = true) public class TenantEntity extends BaseEntity { private static final long serialVersionUID = 1441638860618733611L; @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") - private String tenantId; + protected String tenantId; @io.swagger.annotations.ApiModelProperty(value="父租户ID",name="parentTenantId") - private String parentTenantId; + protected String parentTenantId; public void updateTenantInfo(TenantEntity info) { setTenantId(info.getTenantId()); @@ -34,4 +33,20 @@ public class TenantEntity extends BaseEntity { setParentTenantId(info.getParentTenantId()); } } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getParentTenantId() { + return parentTenantId; + } + + public void setParentTenantId(String parentTenantId) { + this.parentTenantId = parentTenantId; + } } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/base/TenantVEntity.java b/mallinkService/src/main/java/com/iformall/domain/po/base/TenantVEntity.java index badb97106..165753fcb 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/base/TenantVEntity.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/base/TenantVEntity.java @@ -10,17 +10,16 @@ import org.apache.commons.lang3.StringUtils; * @author Stormeye * @date 2019/4/24 14:32 */ -@Data @EqualsAndHashCode(callSuper = true) public class TenantVEntity extends BaseEntity { @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") - private String tenantId; + protected String tenantId; @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value="父租户ID",name="parentTenantId") - private String parentTenantId; + protected String parentTenantId; @TableField(exist = false) @JsonProperty(access = JsonProperty.Access.READ_ONLY) @@ -48,4 +47,24 @@ public class TenantVEntity extends BaseEntity { } }}; } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getParentTenantId() { + return parentTenantId; + } + + public void setParentTenantId(String parentTenantId) { + this.parentTenantId = parentTenantId; + } + + public void setTenantInfo(TenantEntity tenantInfo) { + this.tenantInfo = tenantInfo; + } } diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingTableExcuter.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingTableExcuter.java index 458fdc889..7bc62b972 100644 --- a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingTableExcuter.java +++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingTableExcuter.java @@ -8,7 +8,6 @@ public class ShardingTableExcuter { private static Map tableMap = new ConcurrentHashMap(); public static Map setTableSharding(String table ,ShardingSphere ss) { - System.out.println(">>>>>>>>> tablemap >>>>"+tableMap); tableMap.put(table, ss); return tableMap; } 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 aa59c9509..6691e3fd6 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 @@ -1,21 +1,9 @@ package com.iformall.plugin.shard.plugin; import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.Parenthesis; -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.operators.conditional.AndExpression; -import net.sf.jsqlparser.expression.operators.conditional.OrExpression; -import net.sf.jsqlparser.expression.operators.relational.EqualsTo; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.expression.operators.relational.ItemsList; -import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList; import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; -import net.sf.jsqlparser.statement.create.table.ColDataType; -import net.sf.jsqlparser.statement.create.table.ColumnDefinition; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.delete.Delete; import net.sf.jsqlparser.statement.insert.Insert; @@ -25,14 +13,11 @@ import net.sf.jsqlparser.util.TablesNamesFinder; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.ParameterMapping; -import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.ResultHandler; +import com.alibaba.druid.wall.violation.ErrorCode; import com.iformall.plugin.MyBatisPlus; import com.iformall.plugin.shard.annotation.IgnoreSharding; import com.iformall.plugin.shard.impl.ShardingRuleExcuter; @@ -40,9 +25,10 @@ import com.iformall.plugin.shard.impl.ShardingSphere; import com.iformall.plugin.shard.impl.ShardingTableExcuter; import java.lang.reflect.Method; -import java.sql.Connection; -import java.util.Arrays; -import java.util.HashMap; +import java.math.BigDecimal; +import java.sql.Date; +import java.sql.Time; +import java.sql.Timestamp; import java.util.List; import java.util.Map; import java.util.Properties; @@ -83,21 +69,11 @@ public class ShardingSpherePlugin implements MyBatisPlus { this.dialect = this.properties.getProperty("dialect"); if (null != this.ShardingSpheres) { for (ShardingSphere ss : this.ShardingSpheres) { - System.out.println(">>>>>"+ss.getTableName()+". sharing:"+ss); ShardingTableExcuter.setTableSharding(ss.getTableName(), ss); } } } - private Method findMethod(Method[] methods, String methodName) { - for (Method method : methods) { - if (method.getName().equals(methodName)) { - return method; - } - } - - return null; - } public void intercept(Invocation invocation) throws Throwable { if (!ShardingTableExcuter.hasShardingConfig()) { return ; @@ -105,29 +81,21 @@ public class ShardingSpherePlugin implements MyBatisPlus { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); - Object object = null; - /*分离代理对象链(由于目标类可能被多个拦截器[插件]拦截,从而形成多次代理,通过循环可以分离出最原始的目标类)*/ - while(metaStatementHandler.hasGetter("h")){ - object = metaStatementHandler.getValue("h"); - metaStatementHandler = SystemMetaObject.forObject(object); - } - MappedStatement ms = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement"); - String id = ms.getId(); - String className = id.substring(0, id.lastIndexOf(".")); - String methodName = id.substring(id.lastIndexOf(".") + 1); - Class clazz = Class.forName(className); - Method method = findMethod(clazz.getDeclaredMethods(), methodName); - if (method != null) { - IgnoreSharding ignore = method.getAnnotation(IgnoreSharding.class); - if (null == ignore) { - //Configuration configuration = (Configuration) metaStatementHandler.getValue("delegate.configuration"); + //String id = ms.getId(); + //String className = id.substring(0, id.lastIndexOf(".")); + //String methodName = id.substring(id.lastIndexOf(".") + 1); + //Class clazz = Class.forName(className); + //Method method = getMethodFromAllParent(clazz, methodName); + //if (method != null) { + // IgnoreSharding ignore = method.getAnnotation(IgnoreSharding.class); + // if (null == ignore) { Object parameterObject = metaStatementHandler.getValue("delegate.boundSql.parameterObject"); BoundSql boundSql = statementHandler.getBoundSql(); String newSQL = buildTable(boundSql,parameterObject); metaStatementHandler.setValue("delegate.boundSql.sql", newSQL); - } - } + // } + //} } private String buildTable(BoundSql boundSql,Object parameterObject) throws JSQLParserException { @@ -182,7 +150,8 @@ public class ShardingSpherePlugin implements MyBatisPlus { return oldSql; } String newtable = getShareTable(table,parameterObject); - return oldSql.replaceAll(table+" ", newtable+" ").replaceAll(table+".", newtable+"。").replaceAll(table+")", newtable+")"); + //此处处理前缀相似的表,如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) { @@ -207,8 +176,46 @@ public class ShardingSpherePlugin implements MyBatisPlus { private Object getValue(String column,Object parameterObject) { 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) { + 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; + } + } + } + + private Method getMethodFromAllParent(Class currentClazz,String methodName) { + Method method = null; + for(Class clazz = currentClazz ; clazz != Object.class ; clazz = clazz.getSuperclass()) { + try { + method = clazz.getDeclaredMethod(methodName) ; + } catch (Exception e) { + //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 + //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了 + } } - return parameterObject; + if (null == method) { + throw new RuntimeException(currentClazz+" has no method:"+methodName+"()"); + } + return method; } - }