Kaynağa Gözat

fix 分表bug

release_toaliyun_real
xiaohanzi 5 yıl önce
ebeveyn
işleme
3c5f942a1d
10 değiştirilmiş dosya ile 167 ekleme ve 69 silme
  1. +1
    -1
      mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java
  2. +1
    -1
      mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
  3. +1
    -1
      mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
  4. +1
    -1
      mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java
  5. +44
    -5
      mallinkService/src/main/java/com/iformall/domain/po/base/BaseCUserEntity.java
  6. +22
    -3
      mallinkService/src/main/java/com/iformall/domain/po/base/BaseTenantEntity.java
  7. +18
    -3
      mallinkService/src/main/java/com/iformall/domain/po/base/TenantEntity.java
  8. +22
    -3
      mallinkService/src/main/java/com/iformall/domain/po/base/TenantVEntity.java
  9. +0
    -1
      mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingTableExcuter.java
  10. +57
    -50
      mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/plugin/ShardingSpherePlugin.java

+ 1
- 1
mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java Dosyayı Görüntüle

@@ -14,7 +14,7 @@ public class MyBatisConfiguration extends BaseMyBatisConfiguration{

@Bean
public MyBatisItercepters intercepters() {
return intercepters();
return allIntercepters();
}

@Bean


+ 1
- 1
mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java Dosyayı Görüntüle

@@ -10,6 +10,6 @@ public class MyBatisConfiguration extends BaseMyBatisConfiguration{

@Bean
public MyBatisItercepters intercepters() {
return intercepters();
return allIntercepters();
}
}

+ 1
- 1
mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java Dosyayı Görüntüle

@@ -9,6 +9,6 @@ public class MyBatisConfiguration extends BaseMyBatisConfiguration {

@Bean
public MyBatisItercepters intercepters() {
return intercepters();
return allIntercepters();
}
}

+ 1
- 1
mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java Dosyayı Görüntüle

@@ -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<MyBatisPlus> plugins = new ArrayList<MyBatisPlus>();
plugins.add(multiTenancy());


+ 44
- 5
mallinkService/src/main/java/com/iformall/domain/po/base/BaseCUserEntity.java Dosyayı Görüntüle

@@ -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;
}
}

+ 22
- 3
mallinkService/src/main/java/com/iformall/domain/po/base/BaseTenantEntity.java Dosyayı Görüntüle

@@ -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;
}
}

+ 18
- 3
mallinkService/src/main/java/com/iformall/domain/po/base/TenantEntity.java Dosyayı Görüntüle

@@ -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;
}
}

+ 22
- 3
mallinkService/src/main/java/com/iformall/domain/po/base/TenantVEntity.java Dosyayı Görüntüle

@@ -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;
}
}

+ 0
- 1
mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingTableExcuter.java Dosyayı Görüntüle

@@ -8,7 +8,6 @@ public class ShardingTableExcuter {
private static Map<String,ShardingSphere> tableMap = new ConcurrentHashMap<String, ShardingSphere>();
public static Map<String,ShardingSphere> setTableSharding(String table ,ShardingSphere ss) {
System.out.println(">>>>>>>>> tablemap >>>>"+tableMap);
tableMap.put(table, ss);
return tableMap;
}


+ 57
- 50
mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/plugin/ShardingSpherePlugin.java Dosyayı Görüntüle

@@ -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<Table> 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;
}
}

Yükleniyor…
İptal
Kaydet