diff --git a/mallinkAdmin/pom.xml b/mallinkAdmin/pom.xml
index d5dd190d8..b4e69011d 100644
--- a/mallinkAdmin/pom.xml
+++ b/mallinkAdmin/pom.xml
@@ -23,11 +23,6 @@
mallinkService
1.0
-
- com.iformall
- mybatis-multi-tenancy
- 1.0
-
commons-fileupload
commons-fileupload
diff --git a/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java
index 2c2e4bd9e..4840020d3 100644
--- a/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java
+++ b/mallinkAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -3,15 +3,15 @@ package com.iformall.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.iformall.plugin.MultiTenancy;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
-
import java.util.Properties;
@EnableTransactionManagement
@Configuration
-public class MyBatisConfiguration {
+public class MyBatisConfiguration extends BaseMyBatisConfiguration{
@Bean
@@ -25,6 +25,11 @@ public class MyBatisConfiguration {
multiTenancy.setProperties(properties);
return multiTenancy;
}
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
@Bean
public PaginationInterceptor paginationInterceptor() {
diff --git a/mallinkBApi/pom.xml b/mallinkBApi/pom.xml
index d35260501..9678c5914 100644
--- a/mallinkBApi/pom.xml
+++ b/mallinkBApi/pom.xml
@@ -17,11 +17,6 @@
mallinkService
1.0
-
- com.iformall
- mybatis-multi-tenancy
- 1.0
-
diff --git a/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
index d3baf02c6..f17276366 100644
--- a/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
+++ b/mallinkBApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -1,13 +1,19 @@
package com.iformall.config;
import com.iformall.plugin.MultiTenancy;
+import com.iformall.plugin.shard.impl.EnumShardingRule;
+import com.iformall.plugin.shard.impl.ShardingSphere;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
@Configuration
-public class MyBatisConfiguration {
+public class MyBatisConfiguration extends BaseMyBatisConfiguration{
@Bean
public MultiTenancy multiTenancy() {
@@ -20,4 +26,9 @@ public class MyBatisConfiguration {
multiTenancy.setProperties(properties);
return multiTenancy;
}
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
}
diff --git a/mallinkCApi/pom.xml b/mallinkCApi/pom.xml
index e3708dd5a..9c71414ee 100644
--- a/mallinkCApi/pom.xml
+++ b/mallinkCApi/pom.xml
@@ -17,11 +17,6 @@
mallinkService
1.0
-
- com.iformall
- mybatis-multi-tenancy
- 1.0
-
diff --git a/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
index d3baf02c6..dbd3c59eb 100644
--- a/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
+++ b/mallinkCApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -1,13 +1,19 @@
package com.iformall.config;
import com.iformall.plugin.MultiTenancy;
+import com.iformall.plugin.shard.impl.EnumShardingRule;
+import com.iformall.plugin.shard.impl.ShardingSphere;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
@Configuration
-public class MyBatisConfiguration {
+public class MyBatisConfiguration extends BaseMyBatisConfiguration {
@Bean
public MultiTenancy multiTenancy() {
@@ -20,4 +26,9 @@ public class MyBatisConfiguration {
multiTenancy.setProperties(properties);
return multiTenancy;
}
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
}
diff --git a/mallinkCallback/pom.xml b/mallinkCallback/pom.xml
index f0d9c7642..4d8ffac74 100644
--- a/mallinkCallback/pom.xml
+++ b/mallinkCallback/pom.xml
@@ -23,7 +23,6 @@
mallinkService
1.0
-
diff --git a/mallinkCallback/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkCallback/src/main/java/com/iformall/config/MyBatisConfiguration.java
new file mode 100644
index 000000000..98d9d2b0d
--- /dev/null
+++ b/mallinkCallback/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -0,0 +1,16 @@
+package com.iformall.config;
+
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@EnableTransactionManagement
+@Configuration
+public class MyBatisConfiguration extends BaseMyBatisConfiguration{
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
+}
diff --git a/mallinkMQConsumer/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkMQConsumer/src/main/java/com/iformall/config/MyBatisConfiguration.java
new file mode 100644
index 000000000..44594175c
--- /dev/null
+++ b/mallinkMQConsumer/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -0,0 +1,21 @@
+package com.iformall.config;
+
+import com.iformall.plugin.shard.impl.EnumShardingRule;
+import com.iformall.plugin.shard.impl.ShardingSphere;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+@EnableTransactionManagement
+@Configuration
+public class MyBatisConfiguration extends BaseMyBatisConfiguration {
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
+}
diff --git a/mallinkPosApi/pom.xml b/mallinkPosApi/pom.xml
index db014c7f1..24efb4379 100644
--- a/mallinkPosApi/pom.xml
+++ b/mallinkPosApi/pom.xml
@@ -21,7 +21,7 @@
org.springframework.boot
spring-boot-starter-test
test
-
+
diff --git a/mallinkPosApi/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkPosApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
new file mode 100644
index 000000000..44594175c
--- /dev/null
+++ b/mallinkPosApi/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -0,0 +1,21 @@
+package com.iformall.config;
+
+import com.iformall.plugin.shard.impl.EnumShardingRule;
+import com.iformall.plugin.shard.impl.ShardingSphere;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+@EnableTransactionManagement
+@Configuration
+public class MyBatisConfiguration extends BaseMyBatisConfiguration {
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
+}
diff --git a/mallinkSchedule/pom.xml b/mallinkSchedule/pom.xml
index 298206a96..0c8cdee1b 100644
--- a/mallinkSchedule/pom.xml
+++ b/mallinkSchedule/pom.xml
@@ -17,7 +17,7 @@
com.iformall
mallinkService
1.0
-
+
diff --git a/mallinkSchedule/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkSchedule/src/main/java/com/iformall/config/MyBatisConfiguration.java
new file mode 100644
index 000000000..d43f1ee9d
--- /dev/null
+++ b/mallinkSchedule/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -0,0 +1,16 @@
+package com.iformall.config;
+
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@EnableTransactionManagement
+@Configuration
+public class MyBatisConfiguration extends BaseMyBatisConfiguration {
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
+}
diff --git a/mallinkService/pom.xml b/mallinkService/pom.xml
index e0b95911d..29d293544 100644
--- a/mallinkService/pom.xml
+++ b/mallinkService/pom.xml
@@ -30,7 +30,11 @@
ons-client
1.8.4.Final
-
+
+ com.iformall
+ mybatis-multi-tenancy
+ 1.0
+
diff --git a/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java b/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java
new file mode 100644
index 000000000..f1b794027
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java
@@ -0,0 +1,150 @@
+package com.iformall.config;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import com.iformall.plugin.shard.impl.EnumShardingRule;
+import com.iformall.plugin.shard.impl.ShardingSphere;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+
+public class BaseMyBatisConfiguration {
+
+ //分表配置
+ protected ShardingSpherePlugin baseShardingSpherePlugin() {
+ ShardingSpherePlugin shardingSpherePlugin = new ShardingSpherePlugin();
+ Properties properties = new Properties();
+ properties.setProperty("dialect", "mysql");
+ shardingSpherePlugin.setProperties(properties);
+ List shardingList = new ArrayList();
+ shardingSpherePlugin.setShardingSpheres(shardingList);
+
+ ShardingSphere wxCouponrSharding = new ShardingSphere();
+ wxCouponrSharding.setColumn("tenant_id");
+ wxCouponrSharding.setTableName("wx_coupon");
+ wxCouponrSharding.setCount(100);
+ wxCouponrSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCouponrSharding);
+
+ ShardingSphere wxCouponrMerchantSharding = new ShardingSphere();
+ wxCouponrMerchantSharding.setColumn("tenant_id");
+ wxCouponrMerchantSharding.setTableName("wx_coupon_merchant");
+ wxCouponrMerchantSharding.setCount(100);
+ wxCouponrMerchantSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCouponrMerchantSharding);
+
+ ShardingSphere wxCouponrChannelSharding = new ShardingSphere();
+ wxCouponrChannelSharding.setColumn("tenant_id");
+ wxCouponrChannelSharding.setTableName("wx_coupon_channel");
+ wxCouponrChannelSharding.setCount(100);
+ wxCouponrChannelSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCouponrChannelSharding);
+
+ ShardingSphere wxCUserSharding = new ShardingSphere();
+ wxCUserSharding.setColumn("tenant_id");
+ wxCUserSharding.setTableName("wx_c_user");
+ wxCUserSharding.setCount(100);
+ wxCUserSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCUserSharding);
+
+ ShardingSphere basicInfoSharding = new ShardingSphere();
+ basicInfoSharding.setColumn("final_tenant_id");
+ basicInfoSharding.setTableName("wx_c_user_basic_info");
+ basicInfoSharding.setCount(100);
+ basicInfoSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(basicInfoSharding);
+
+ ShardingSphere wxOrderSharding = new ShardingSphere();
+ wxOrderSharding.setColumn("tenant_id");
+ wxOrderSharding.setTableName("wx_order");
+ wxOrderSharding.setCount(100);
+ wxOrderSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxOrderSharding);
+
+ ShardingSphere wxPayOrderSharding = new ShardingSphere();
+ wxPayOrderSharding.setColumn("tenant_id");
+ wxPayOrderSharding.setTableName("wx_pay_order");
+ wxPayOrderSharding.setCount(100);
+ wxPayOrderSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxPayOrderSharding);
+
+ ShardingSphere wxCouponOrderSharding = new ShardingSphere();
+ wxCouponOrderSharding.setColumn("tenant_id");
+ wxCouponOrderSharding.setTableName("wx_coupon_order");
+ wxCouponOrderSharding.setCount(100);
+ wxCouponOrderSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCouponOrderSharding);
+
+ ShardingSphere wxOrderGroupSharding = new ShardingSphere();
+ wxOrderGroupSharding.setColumn("tenant_id");
+ wxOrderGroupSharding.setTableName("wx_order_group");
+ wxOrderGroupSharding.setCount(100);
+ wxOrderGroupSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxOrderGroupSharding);
+
+ ShardingSphere wxOrderPressSharding = new ShardingSphere();
+ wxOrderPressSharding.setColumn("tenant_id");
+ wxOrderPressSharding.setTableName("wx_order_press");
+ wxOrderPressSharding.setCount(100);
+ wxOrderPressSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxOrderPressSharding);
+
+ ShardingSphere wxPosOrderSharding = new ShardingSphere();
+ wxPosOrderSharding.setColumn("tenant_id");
+ wxPosOrderSharding.setTableName("pos_order");
+ wxPosOrderSharding.setCount(100);
+ wxPosOrderSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxPosOrderSharding);
+
+ ShardingSphere wxPosPayOrderSharding = new ShardingSphere();
+ wxPosPayOrderSharding.setColumn("tenant_id");
+ wxPosPayOrderSharding.setTableName("pos_pay_order");
+ wxPosPayOrderSharding.setCount(100);
+ wxPosPayOrderSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxPosPayOrderSharding);
+
+ ShardingSphere wxScoreHistorySharding = new ShardingSphere();
+ wxScoreHistorySharding.setColumn("tenant_id");
+ wxScoreHistorySharding.setTableName("wx_score_history");
+ wxScoreHistorySharding.setCount(100);
+ wxScoreHistorySharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxScoreHistorySharding);
+
+ ShardingSphere wxCreditHistorySharding = new ShardingSphere();
+ wxScoreHistorySharding.setColumn("tenant_id");
+ wxScoreHistorySharding.setTableName("wx_credit_history");
+ wxScoreHistorySharding.setCount(100);
+ wxScoreHistorySharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCreditHistorySharding);
+
+ ShardingSphere wxCarCmdLogSharding = new ShardingSphere();
+ wxCarCmdLogSharding.setColumn("tenant_id");
+ wxCarCmdLogSharding.setTableName("wx_car_cmd_log");
+ wxCarCmdLogSharding.setCount(100);
+ wxCarCmdLogSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCarCmdLogSharding);
+
+ ShardingSphere wxMerchantSubsidySharding = new ShardingSphere();
+ wxMerchantSubsidySharding.setColumn("tenant_id");
+ wxMerchantSubsidySharding.setTableName("wx_merchant_subsidy");
+ wxMerchantSubsidySharding.setCount(100);
+ wxMerchantSubsidySharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxMerchantSubsidySharding);
+
+ ShardingSphere wxProfitSharingOrderSharding = new ShardingSphere();
+ wxProfitSharingOrderSharding.setColumn("tenant_id");
+ wxProfitSharingOrderSharding.setTableName("wx_profit_sharing_order");
+ wxProfitSharingOrderSharding.setCount(100);
+ wxProfitSharingOrderSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxProfitSharingOrderSharding);
+
+ ShardingSphere wxCouponActionLogSharding = new ShardingSphere();
+ wxCouponActionLogSharding.setColumn("tenant_id");
+ wxCouponActionLogSharding.setTableName("wx_coupon_action_log");
+ wxCouponActionLogSharding.setCount(100);
+ wxCouponActionLogSharding.setRule(EnumShardingRule.HASH.getCode());
+ shardingList.add(wxCouponActionLogSharding);
+
+ return shardingSpherePlugin;
+ }
+}
diff --git a/mallinkSysAdmin/pom.xml b/mallinkSysAdmin/pom.xml
index c9d60a5d0..9544ca12d 100644
--- a/mallinkSysAdmin/pom.xml
+++ b/mallinkSysAdmin/pom.xml
@@ -40,7 +40,6 @@
kaptcha
0.0.9
-
diff --git a/mallinkSysAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkSysAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java
new file mode 100644
index 000000000..44594175c
--- /dev/null
+++ b/mallinkSysAdmin/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -0,0 +1,21 @@
+package com.iformall.config;
+
+import com.iformall.plugin.shard.impl.EnumShardingRule;
+import com.iformall.plugin.shard.impl.ShardingSphere;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+@EnableTransactionManagement
+@Configuration
+public class MyBatisConfiguration extends BaseMyBatisConfiguration {
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
+}
diff --git a/mallinkSysAdmin/src/main/resources/application-dev.yml b/mallinkSysAdmin/src/main/resources/application-dev.yml
index 8bf98c784..b86a317f0 100644
--- a/mallinkSysAdmin/src/main/resources/application-dev.yml
+++ b/mallinkSysAdmin/src/main/resources/application-dev.yml
@@ -3,7 +3,11 @@ spring:
include: rabbitMQ
# JDBC
datasource:
+<<<<<<< HEAD
+ url: jdbc:mysql://202.165.179.86:3306/mallink_share?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true
+=======
url: jdbc:mysql://101.200.130.134:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true
+>>>>>>> release_real_202010
username: root
password: fm2020test
type: com.alibaba.druid.pool.DruidDataSource
diff --git a/mallinkWebSocketServer/pom.xml b/mallinkWebSocketServer/pom.xml
index 942092684..6b91cf9f3 100644
--- a/mallinkWebSocketServer/pom.xml
+++ b/mallinkWebSocketServer/pom.xml
@@ -25,7 +25,7 @@
org.springframework.boot
spring-boot-starter-reactor-netty
-
+
diff --git a/mallinkWebSocketServer/src/main/java/com/iformall/config/MyBatisConfiguration.java b/mallinkWebSocketServer/src/main/java/com/iformall/config/MyBatisConfiguration.java
new file mode 100644
index 000000000..ce76b65a1
--- /dev/null
+++ b/mallinkWebSocketServer/src/main/java/com/iformall/config/MyBatisConfiguration.java
@@ -0,0 +1,21 @@
+package com.iformall.config;
+
+import com.iformall.plugin.shard.impl.EnumShardingRule;
+import com.iformall.plugin.shard.impl.ShardingSphere;
+import com.iformall.plugin.shard.plugin.ShardingSpherePlugin;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+@EnableTransactionManagement
+@Configuration
+public class MyBatisConfiguration extends BaseMyBatisConfiguration {
+
+ @Bean
+ public ShardingSpherePlugin shardingSpherePlugin() {
+ return baseShardingSpherePlugin();
+ }
+}
diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/annotation/IgnoreSharding.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/annotation/IgnoreSharding.java
new file mode 100644
index 000000000..c8388fb10
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/annotation/IgnoreSharding.java
@@ -0,0 +1,16 @@
+package com.iformall.plugin.shard.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 在mapper方法上面用
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface IgnoreSharding {
+}
diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/EnumShardingRule.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/EnumShardingRule.java
new file mode 100644
index 000000000..1d48fcf4e
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/EnumShardingRule.java
@@ -0,0 +1,27 @@
+package com.iformall.plugin.shard.impl;
+
+public enum EnumShardingRule {
+
+ HASH(1,"哈希值分表");
+
+
+ private Integer code;
+ private String name;
+
+ private EnumShardingRule(Integer code, String name) {
+ this.code = code;
+ this.name = name;
+ }
+ public Integer getCode() {
+ return code;
+ }
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingRuleExcuter.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingRuleExcuter.java
new file mode 100644
index 000000000..fa5987a2f
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingRuleExcuter.java
@@ -0,0 +1,29 @@
+package com.iformall.plugin.shard.impl;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.alibaba.druid.util.StringUtils;
+import com.iformall.plugin.shard.impl.rule.ShardingRuleDefaultService;
+import com.iformall.plugin.shard.impl.rule.ShardingRuleService;
+
+public class ShardingRuleExcuter {
+
+ private static Map serviceMap = null;
+
+ private static Map getServiceMap() {
+ if (null == serviceMap) {
+ serviceMap = new ConcurrentHashMap();
+ serviceMap.put(EnumShardingRule.HASH.getCode(), new ShardingRuleDefaultService());
+ }
+ return serviceMap;
+ }
+
+ public static String getTableIndex(Integer rule,Object value,int tableCount) {
+ String index = getServiceMap().get(rule).getTableIndex(value, tableCount);
+ if (StringUtils.isEmpty(index)) {
+ throw new RuntimeException("Sharding Rule["+rule+"] not support. column value:"+value+" tableCount:"+tableCount) ;
+ }
+ return index;
+ }
+}
diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingSphere.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingSphere.java
new file mode 100644
index 000000000..b2a6ca318
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingSphere.java
@@ -0,0 +1,38 @@
+package com.iformall.plugin.shard.impl;
+
+public class ShardingSphere {
+
+ public static final String TABLE_SUFFIX = "_";
+ /*表名,不用带下划线**/
+ private String tableName;
+ /*分表列名**/
+ private String column;
+ /*分表规则**/
+ private Integer rule;
+ /*表数量**/
+ private Integer count;
+ public String getTableName() {
+ return tableName;
+ }
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+ public String getColumn() {
+ return column;
+ }
+ public void setColumn(String column) {
+ this.column = column;
+ }
+ public Integer getRule() {
+ return rule;
+ }
+ public void setRule(Integer rule) {
+ this.rule = rule;
+ }
+ public Integer getCount() {
+ return count;
+ }
+ public void setCount(Integer count) {
+ this.count = count;
+ }
+}
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
new file mode 100644
index 000000000..7bc62b972
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/ShardingTableExcuter.java
@@ -0,0 +1,33 @@
+package com.iformall.plugin.shard.impl;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ShardingTableExcuter {
+
+ private static Map tableMap = new ConcurrentHashMap();
+
+ public static Map setTableSharding(String table ,ShardingSphere ss) {
+ tableMap.put(table, ss);
+ return tableMap;
+ }
+
+ public static ShardingSphere getShardingSphere(String table) {
+ return tableMap.get(table);
+ }
+
+ public static boolean isShardingTable(String table) {
+ ShardingSphere ss = getShardingSphere(table);
+ if (null == ss) {
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean hasShardingConfig() {
+ if (null == tableMap || tableMap.size() <= 0) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/rule/ShardingRuleDefaultService.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/rule/ShardingRuleDefaultService.java
new file mode 100644
index 000000000..7ee89d573
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/rule/ShardingRuleDefaultService.java
@@ -0,0 +1,32 @@
+package com.iformall.plugin.shard.impl.rule;
+
+public class ShardingRuleDefaultService implements ShardingRuleService {
+
+ @Override
+ public String getTableIndex(Object value, int count) {
+ if (null == value || count <= 0 ) {
+ return null;
+ }
+ int hash = 9999999;
+ //如果是整数,则直接变为Long,好查询
+ if (value instanceof String) {
+ try {
+ Long lvalue = Long.parseLong((String)value);
+ hash = getHashCode(lvalue);
+ }catch(Exception e) {
+ hash = getHashCode(value);
+ }
+ }else {
+ hash = getHashCode(value);
+ }
+ return String.valueOf(hash%count);
+ }
+
+ private int getHashCode(Object value) {
+ int hash = value.hashCode();
+ if (hash < 0 ) {
+ hash = Math.abs(hash);
+ }
+ return hash;
+ }
+}
diff --git a/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/rule/ShardingRuleService.java b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/rule/ShardingRuleService.java
new file mode 100644
index 000000000..54291bd49
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/impl/rule/ShardingRuleService.java
@@ -0,0 +1,6 @@
+package com.iformall.plugin.shard.impl.rule;
+
+public interface ShardingRuleService {
+
+ public String getTableIndex(Object value,int count);
+}
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
new file mode 100644
index 000000000..6823395d0
--- /dev/null
+++ b/mybatis-multi-tenancy/src/main/java/com/iformall/plugin/shard/plugin/ShardingSpherePlugin.java
@@ -0,0 +1,227 @@
+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;
+import net.sf.jsqlparser.statement.select.*;
+import net.sf.jsqlparser.statement.update.Update;
+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.iformall.plugin.shard.annotation.IgnoreSharding;
+import com.iformall.plugin.shard.impl.ShardingRuleExcuter;
+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.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ *分表
+ */
+@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 ShardingSpherePlugin implements Interceptor {
+
+
+ public ShardingSpherePlugin(){
+ }
+
+ //属性参数信息
+ private Properties properties;
+ private String dialect = "mysql";
+ private List ShardingSpheres;
+ public String getDialect() {
+ return dialect;
+ }
+ public void setDialect(String dialect) {
+ this.dialect = dialect;
+ }
+ public List getShardingSpheres() {
+ return ShardingSpheres;
+ }
+ public void setShardingSpheres(List shardingSpheres) {
+ ShardingSpheres = shardingSpheres;
+ }
+
+ /**
+ * 生成代理对象
+ *
+ * @param target
+ * @return
+ */
+ @Override
+ public Object plugin(Object target) {
+ if (target instanceof StatementHandler) {
+ return Plugin.wrap(target, this);
+ } else {
+ return target;
+ }
+ }
+
+ /**
+ * 获取配置信息
+ * {dialect=mysql, tenantInfo=org.xue.test.TenantInfoImpl, tenantIdColumn=tenant_id, parentTenantIdColumn=parent_tenant_id}
+ * @param properties
+ */
+ @Override
+ public void setProperties(Properties properties) {
+ this.properties=properties;
+ this.dialect = this.properties.getProperty("dialect");
+ if (null != this.ShardingSpheres) {
+ for (ShardingSphere ss : this.ShardingSpheres) {
+ 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 Object intercept(Invocation invocation) throws Throwable {
+ if (!ShardingTableExcuter.hasShardingConfig()) {
+ return invocation.proceed();
+ }
+ StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
+ MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);
+ 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");
+ Object parameterObject = metaStatementHandler.getValue("delegate.boundSql.parameterObject");
+ BoundSql boundSql = statementHandler.getBoundSql();
+ String newSQL = buildTable(boundSql,parameterObject);
+ metaStatementHandler.setValue("delegate.boundSql.sql", newSQL);
+ }
+ }
+ return invocation.proceed();
+ }
+
+ private String buildTable(BoundSql boundSql,Object parameterObject) throws JSQLParserException {
+ String oldSql = boundSql.getSql();
+ Statement stmt = CCJSqlParserUtil.parse(oldSql);
+ if (stmt instanceof Insert) {
+ return buildInsert((Insert) stmt,oldSql,parameterObject);
+ }
+
+ if (stmt instanceof Delete) {
+ return buildDelete((Delete) stmt,oldSql,parameterObject);
+ }
+
+ if (stmt instanceof Update) {
+ return buildUpdate((Update) stmt,oldSql,parameterObject);
+ }
+
+ if (stmt instanceof Select) {
+ return buildSelect((Select) stmt,oldSql,parameterObject);
+ }
+
+ if (stmt instanceof CreateTable) {
+ return oldSql;
+ }
+ throw new RuntimeException("非法sql语句,请检查"+oldSql);
+ }
+
+ private String buildInsert(Insert stmt,String oldSql,Object parameterObject) {
+ return buildTable(stmt.getTable(), oldSql, parameterObject);
+ }
+
+ private String buildDelete(Delete stmt,String oldSql,Object parameterObject) {
+ return buildTable(stmt.getTable(), oldSql, parameterObject);
+ }
+
+ private String buildUpdate(Update stmt,String oldSql,Object parameterObject) {
+ return buildListTables(stmt.getTables(), oldSql, parameterObject);
+ }
+
+ private String buildSelect(Select stmt,String oldSql,Object parameterObject) {
+ TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
+ List tableList = tablesNamesFinder.getTableList(stmt);
+ return buildByListTableNames(tableList, oldSql, parameterObject);
+ }
+
+ private String buildTable(Table table,String oldSql,Object parameterObject) {
+ return buildByTableName(table.getName(), oldSql, parameterObject);
+ }
+
+ private String buildByTableName(String table,String oldSql,Object parameterObject) {
+ if (!ShardingTableExcuter.isShardingTable(table)) {
+ return oldSql;
+ }
+ String newtable = getShareTable(table,parameterObject);
+ return oldSql.replaceAll(table+" ", newtable+" ").replaceAll(table+".", newtable+"。").replaceAll(table+")", newtable+")");
+ }
+
+ private String buildListTables(List tables,String oldSql,Object parameterObject) {
+ for (Table t : tables) {
+ oldSql = buildTable(t,oldSql,parameterObject);
+ }
+ return oldSql;
+ }
+
+ private String buildByListTableNames(List tables,String oldSql,Object parameterObject) {
+ for (String t : tables) {
+ oldSql = buildByTableName(t,oldSql,parameterObject);
+ }
+ return oldSql;
+ }
+
+ private String getShareTable(String table,Object parameterObject) {
+ ShardingSphere ss = ShardingTableExcuter.getShardingSphere(table);
+ return ss.getTableName()+ShardingSphere.TABLE_SUFFIX+ShardingRuleExcuter.getTableIndex(ss.getRule(), getValue(ss.getColumn(),parameterObject), ss.getCount());
+ }
+
+ private Object getValue(String column,Object parameterObject) {
+ if (parameterObject instanceof Map) {
+ return ((Map) parameterObject).get(column);
+ }
+ return parameterObject;
+ }
+
+}