├── .settings ├── org.eclipse.core.resources.prefs ├── org.eclipse.jdt.core.prefs └── org.eclipse.m2e.core.prefs ├── README.md ├── pom.xml ├── springboot-mybatis-interceptor-on-the-database-level-table.iml ├── src └── main │ ├── java │ └── com │ │ └── java │ │ └── mmzsit │ │ ├── SubTableApplication.java │ │ ├── config │ │ ├── DataSourceConfig.java │ │ ├── InterceptConfig.java │ │ └── StrategyConfig.java │ │ ├── controller │ │ └── TableController.java │ │ ├── dao │ │ └── TestdatasDao.java │ │ ├── entity │ │ └── TestDatas.java │ │ ├── framework │ │ ├── annotation │ │ │ ├── TableSplitRule.java │ │ │ └── TableSplitTarget.java │ │ ├── interceptor │ │ │ └── TableSplitInterceptor.java │ │ ├── mybatisStrategy │ │ │ ├── StrategyManager.java │ │ │ └── strategy │ │ │ │ ├── Strategy.java │ │ │ │ └── impl │ │ │ │ └── YYYYMM01Strategy.java │ │ └── util │ │ │ └── DateUtil.java │ │ └── service │ │ ├── AddData.java │ │ └── impl │ │ └── AddDataImpl.java │ └── resources │ ├── application-dev.yml │ ├── application-prod.yml │ ├── application.yml │ ├── createTable │ └── create.sql │ ├── generatorConfig.xml │ ├── jar │ ├── mysql-connector-java-5.1.42.jar │ └── ojdbc6-11.2.0.3.jar │ ├── log4j2.xml │ └── mapper │ └── TestdatasMapper.xml └── target ├── classes ├── application-dev.yml ├── application-prod.yml ├── application.yml ├── createTable │ └── create.sql ├── generatorConfig.xml ├── jar │ ├── mysql-connector-java-5.1.42.jar │ └── ojdbc6-11.2.0.3.jar ├── log4j2.xml └── mapper │ └── TestdatasMapper.xml └── maven-status └── maven-compiler-plugin └── compile └── default-compile ├── createdFiles.lst └── inputFiles.lst /.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/main/java=UTF-8 3 | encoding//src/main/resources=UTF-8 4 | encoding//src/test/java=UTF-8 5 | encoding/=UTF-8 6 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 3 | org.eclipse.jdt.core.compiler.compliance=1.8 4 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 5 | org.eclipse.jdt.core.compiler.source=1.8 6 | -------------------------------------------------------------------------------- /.settings/org.eclipse.m2e.core.prefs: -------------------------------------------------------------------------------- 1 | activeProfiles= 2 | eclipse.preferences.version=1 3 | resolveWorkspaceProjects=true 4 | version=1 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # springboot-mybatisInterceptor 2 | springboot工程 3 | 4 | 整合mybatis拦截器的按月分表功能 5 | 6 | 7 | 使用说明文档: 8 | https://www.cnblogs.com/mmzs/p/11174551.html 9 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.java.mmzsit 8 | springboot-mybatis-interceptor-on-the-database-level-table 9 | 1.0-SNAPSHOT 10 | springboot-mybatis-interceptor-on-the-database-level-table 11 | http://maven.apache.org 12 | 13 | 14 | org.springframework.boot 15 | spring-boot-parent 16 | 2.0.4.RELEASE 17 | 18 | 19 | 20 | UTF-8 21 | 1.8 22 | 1.8 23 | 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter 30 | 2.0.4.RELEASE 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-web 36 | 37 | 38 | org.springframework.boot 39 | spring-boot-starter-logging 40 | 41 | 42 | 43 | 44 | 45 | org.springframework.boot 46 | spring-boot-starter-log4j2 47 | 48 | 49 | 56 | 57 | 58 | 59 | com.oracle 60 | ojdbc6 61 | 11.2.0.3 62 | 63 | 64 | 65 | com.alibaba 66 | druid-spring-boot-starter 67 | 1.1.10 68 | 69 | 70 | 71 | org.mybatis.spring.boot 72 | mybatis-spring-boot-starter 73 | 1.3.2 74 | 75 | 76 | 77 | org.projectlombok 78 | lombok 79 | 80 | 81 | org.codehaus.plexus 82 | plexus-classworlds 83 | 2.5.1 84 | 85 | 86 | 87 | org.mybatis.generator 88 | mybatis-generator-core 89 | 1.3.2 90 | jar 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | org.springframework.boot 103 | spring-boot-maven-plugin 104 | 105 | 106 | 107 | org.mybatis.generator 108 | mybatis-generator-maven-plugin 109 | 1.3.2 110 | 111 | 112 | 113 | 114 | 115 | 116 | spring-snapshots 117 | Spring Snapshots 118 | https://repo.spring.io/snapshot 119 | 120 | true 121 | 122 | 123 | 124 | spring-milestones 125 | Spring Milestones 126 | https://repo.spring.io/milestone 127 | 128 | false 129 | 130 | 131 | 132 | aliyun 133 | http://maven.aliyun.com/nexus/content/groups/public/ 134 | 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /springboot-mybatis-interceptor-on-the-database-level-table.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/SubTableApplication.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | /** 8 | * @author :mmzsit 9 | * @description:启动类 10 | * @date :2019/6/13 11:18 11 | */ 12 | @SpringBootApplication 13 | @MapperScan({"com.java.mmzsit.dao"}) 14 | //@EnableAsync 15 | public class SubTableApplication { 16 | public static void main(String[] args) { 17 | SpringApplication.run(SubTableApplication.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/config/DataSourceConfig.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.config; 2 | 3 | import com.alibaba.druid.pool.DruidDataSource; 4 | import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; 5 | import com.alibaba.druid.support.http.StatViewServlet; 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 8 | import org.springframework.boot.context.properties.ConfigurationProperties; 9 | import org.springframework.boot.web.servlet.ServletRegistrationBean; 10 | import org.springframework.context.annotation.Bean; 11 | import org.springframework.context.annotation.Configuration; 12 | import javax.sql.DataSource; 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | /** 16 | * @author :mmzsit 17 | * @description: 18 | * @date :2019/6/13 11:45 19 | */ 20 | 21 | 22 | @Configuration 23 | @ConditionalOnClass(com.alibaba.druid.pool.DruidDataSource.class) 24 | @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource", matchIfMissing = true) 25 | public class DataSourceConfig { 26 | 27 | @Bean 28 | @ConfigurationProperties("spring.datasource.druid") 29 | public DataSource dataSourceOne() { 30 | return DruidDataSourceBuilder.create().build(); 31 | } 32 | 33 | /** 34 | * 注册Servlet信息, 配置监控视图 35 | * 36 | * @return 返回监控注册的servlet对象 37 | */ 38 | @Bean 39 | public ServletRegistrationBean druidServlet() { 40 | ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); 41 | servletRegistrationBean.setServlet(new StatViewServlet()); 42 | servletRegistrationBean.addUrlMappings("/druid/*"); 43 | Map initParameters = new HashMap<>(); 44 | /** 45 | * 禁用HTML页面上的“Rest All”功能 46 | */ 47 | initParameters.put("resetEnable", "false"); 48 | /** 49 | * ip白名单(没有配置或者为空,则允许所有访问) 50 | */ 51 | // initParameters.put("allow", "10.8.9.115"); 52 | /** 53 | * 监控页面登录用户名 54 | */ 55 | initParameters.put("loginUsername", "admin"); 56 | /** 57 | * 监控页面登录用户密码 58 | */ 59 | initParameters.put("loginPassword", "admin"); 60 | initParameters.put("deny", ""); //ip黑名单 61 | /** 62 | 如果某个ip同时存在,deny优先于allow 63 | */ 64 | servletRegistrationBean.setInitParameters(initParameters); 65 | return servletRegistrationBean; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/config/InterceptConfig.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.config; 2 | 3 | import com.java.mmzsit.framework.interceptor.TableSplitInterceptor; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | /** 7 | * @author :mmzsit 8 | * @description: 9 | * @date :2019/6/14 10:08 10 | */ 11 | @Configuration 12 | public class InterceptConfig { 13 | 14 | /** 15 | * mybatis分表拦截器 16 | * @return 17 | */ 18 | @Bean 19 | public TableSplitInterceptor initTableSplitInterceptor() { 20 | return new TableSplitInterceptor(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/config/StrategyConfig.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.config; 2 | 3 | import com.java.mmzsit.framework.mybatisStrategy.StrategyManager; 4 | import com.java.mmzsit.framework.mybatisStrategy.strategy.impl.YYYYMM01Strategy; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | /** 9 | * 分表策略管理类 10 | * @author mmzsit 11 | * 12 | */ 13 | @Configuration 14 | public class StrategyConfig { 15 | 16 | /** 17 | * 策略配置类 18 | * @return 19 | */ 20 | @Bean 21 | public StrategyManager strategyManager() { 22 | StrategyManager strategyManager = new StrategyManager(); 23 | strategyManager.addStrategy(StrategyManager._YYYYMM01, new YYYYMM01Strategy()); 24 | return strategyManager; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/controller/TableController.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.controller; 2 | 3 | import com.java.mmzsit.entity.TestDatas; 4 | import com.java.mmzsit.service.AddData; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | import javax.annotation.Resource; 9 | 10 | /** 11 | * @author :mmzsit 12 | * @description: 13 | * @date :2019/6/10 15:04 14 | */ 15 | @RestController 16 | @RequestMapping() 17 | @Slf4j(topic = "【TableController】Mybatis拦截器对数据库水平分表控制类") 18 | @SuppressWarnings({"unchecked", "rawtypes"}) 19 | public class TableController { 20 | @Resource 21 | private AddData addData; 22 | 23 | @GetMapping("/add") 24 | public String uploadTripScan() { 25 | 26 | int result = 0; 27 | int j = 0; 28 | for (int i=0; i < 3; i++){ 29 | TestDatas datas = new TestDatas(); 30 | datas.setId(j++); 31 | datas.setName("数据"+j); 32 | datas.setAge(""+j); 33 | datas.setInformation("测试信息"+j++); 34 | datas.setUpdatedate((201905+i)+"01"); 35 | result += addData.add(datas); 36 | } 37 | 38 | return "成功插入" + result + "条数据"; 39 | } 40 | 41 | 42 | 43 | @PostMapping("/postadd") 44 | public String uploadTripScan(@RequestBody String reqdata) { 45 | 46 | return null; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/dao/TestdatasDao.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.dao; 2 | 3 | import com.java.mmzsit.framework.annotation.TableSplitRule; 4 | import com.java.mmzsit.framework.annotation.TableSplitTarget; 5 | import com.java.mmzsit.framework.mybatisStrategy.StrategyManager; 6 | import com.java.mmzsit.entity.TestDatas; 7 | 8 | @TableSplitTarget(rules={@TableSplitRule(tableName="TESTDATAS",paramName="updatedate",targetName=StrategyManager._YYYYMM01)}) 9 | public interface TestdatasDao { 10 | 11 | /** 12 | * 插入数据 13 | * @param record 14 | * @return 15 | */ 16 | int insert(TestDatas record); 17 | } -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/entity/TestDatas.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.entity; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Builder 12 | public class TestDatas { 13 | private int id; 14 | 15 | private String name; 16 | 17 | private String age; 18 | 19 | private String information; 20 | 21 | private String updatedate; 22 | 23 | } -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/framework/annotation/TableSplitRule.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.framework.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 分表规则 10 | * @author mmzsit 11 | * 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ElementType.TYPE}) 15 | public @interface TableSplitRule { 16 | 17 | public String tableName(); 18 | 19 | //暂时只支持单参数 20 | public String paramName(); 21 | 22 | public String targetName(); 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/framework/annotation/TableSplitTarget.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.framework.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 分表策略拦截 10 | * @author mmzsit 11 | * 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ElementType.TYPE}) 15 | public @interface TableSplitTarget { 16 | 17 | boolean interFale() default true; 18 | //分表规则 19 | public TableSplitRule[] rules(); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/framework/interceptor/TableSplitInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.framework.interceptor; 2 | 3 | import com.java.mmzsit.framework.annotation.TableSplitRule; 4 | import com.java.mmzsit.framework.annotation.TableSplitTarget; 5 | import com.java.mmzsit.framework.mybatisStrategy.strategy.Strategy; 6 | import com.java.mmzsit.framework.mybatisStrategy.StrategyManager; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.apache.ibatis.executor.statement.StatementHandler; 9 | import org.apache.ibatis.mapping.MappedStatement; 10 | import org.apache.ibatis.plugin.*; 11 | import org.apache.ibatis.reflection.DefaultReflectorFactory; 12 | import org.apache.ibatis.reflection.MetaObject; 13 | import org.apache.ibatis.reflection.SystemMetaObject; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | 16 | import java.lang.reflect.Field; 17 | import java.sql.Connection; 18 | import java.util.Map; 19 | import java.util.Properties; 20 | 21 | /** 22 | * @author :mmzsit 23 | * @description:策略分表拦截器 24 | * @date :2019/6/14 10:10 25 | */ 26 | @Slf4j(topic="策略分表拦截器【TableSplitInterceptor】") 27 | 28 | @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class,Integer.class }) }) 29 | public class TableSplitInterceptor implements Interceptor { 30 | 31 | @Autowired 32 | StrategyManager strategyManager; 33 | 34 | @Override 35 | public Object intercept(Invocation invocation) throws Throwable { 36 | log.info("进入mybatisSql拦截器:===================="); 37 | StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); 38 | MetaObject metaStatementHandler = 39 | MetaObject.forObject(statementHandler,SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory()); 40 | Object parameterObject = metaStatementHandler.getValue("delegate.boundSql.parameterObject"); 41 | doSplitTable(metaStatementHandler,parameterObject); 42 | // 传递给下一个拦截器处理 43 | return invocation.proceed(); 44 | } 45 | 46 | @Override 47 | public Object plugin(Object arg0) { 48 | //System.err.println(arg0.getClass()); 49 | if (arg0 instanceof StatementHandler) { 50 | return Plugin.wrap(arg0, this); 51 | } else { 52 | return arg0; 53 | } 54 | } 55 | 56 | @Override 57 | public void setProperties(Properties arg0) { 58 | 59 | } 60 | 61 | private void doSplitTable(MetaObject metaStatementHandler,Object param) throws ClassNotFoundException{ 62 | String originalSql = (String) metaStatementHandler.getValue("delegate.boundSql.sql"); 63 | if (originalSql != null && !originalSql.equals("")) { 64 | log.info("分表前的SQL:"+originalSql); 65 | MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement"); 66 | String id = mappedStatement.getId(); 67 | String className = id.substring(0, id.lastIndexOf(".")); 68 | Class classObj = Class.forName(className); 69 | // 根据配置自动生成分表SQL 70 | TableSplitTarget tableSplit = classObj.getAnnotation(TableSplitTarget.class); 71 | if(tableSplit==null||!tableSplit.interFale()) { 72 | return ; 73 | } 74 | TableSplitRule[] rules = tableSplit.rules(); 75 | if (rules != null && rules.length>0) { 76 | 77 | String convertedSql= null; 78 | // StrategyManager可以使用ContextHelper策略帮助类获取,本次使用注入 79 | for(TableSplitRule rule : rules) { 80 | Strategy strategy = null; 81 | 82 | if(rule.targetName()!=null&&!rule.targetName().isEmpty()) { 83 | strategy = strategyManager.getStrategy(rule.targetName()); 84 | } 85 | if(!rule.paramName().isEmpty()&&!rule.tableName().isEmpty()) { 86 | 87 | String paramValue = getParamValue(param, rule.paramName()); 88 | //System.err.println("paramValue:"+paramValue); 89 | //获取 参数 90 | String newTableName = strategy.returnTableName(rule.tableName(), paramValue); 91 | try { 92 | convertedSql = originalSql.replaceAll(rule.tableName(),newTableName ); 93 | } catch (Exception e) { 94 | e.printStackTrace(); 95 | } 96 | } 97 | 98 | } 99 | log.info("新sql是:" + convertedSql); 100 | metaStatementHandler.setValue("delegate.boundSql.sql",convertedSql); 101 | } 102 | } 103 | } 104 | 105 | public String getParamValue(Object obj,String paramName) { 106 | if(obj instanceof Map) { 107 | return (String) ((Map) obj).get(paramName); 108 | } 109 | Field[] fields = obj.getClass().getDeclaredFields(); 110 | for(Field field : fields) { 111 | field.setAccessible(true); 112 | //System.err.println(field.getName()); 113 | if(field.getName().equalsIgnoreCase(paramName)) { 114 | try { 115 | return (String) field.get(obj); 116 | } catch (IllegalArgumentException e) { 117 | e.printStackTrace(); 118 | } catch (IllegalAccessException e) { 119 | e.printStackTrace(); 120 | } 121 | 122 | } 123 | } 124 | return null; 125 | } 126 | 127 | } 128 | 129 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/framework/mybatisStrategy/StrategyManager.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.framework.mybatisStrategy; 2 | 3 | import com.java.mmzsit.framework.mybatisStrategy.strategy.Strategy; 4 | 5 | import java.util.Map; 6 | import java.util.concurrent.ConcurrentHashMap; 7 | /** 8 | * @author :mmzsit 9 | * @description: 10 | * @date :2019/6/13 10:28 11 | */ 12 | public class StrategyManager { 13 | 14 | public static final String _YYYYMM01 = "YYYYMM01"; //策略名称 15 | 16 | public static final String _YYYYMMDD = "YYYYMMDD"; 17 | 18 | public static final String _YYYYMM = "YYYYMM"; 19 | 20 | private Map strategies = new ConcurrentHashMap(10); 21 | 22 | /** 23 | * 向管理器中添加策略 24 | * @param strategyName 25 | * @param strategy 26 | */ 27 | public void addStrategy(String strategyName,Strategy strategy) { 28 | strategies.put(strategyName, strategy); 29 | } 30 | 31 | public Strategy getStrategy(String key){ 32 | return strategies.get(key); 33 | } 34 | 35 | public Map getStrategies() { 36 | return strategies; 37 | } 38 | 39 | public void setStrategies(Map strategies) { 40 | for(Map.Entry entry : strategies.entrySet()){ 41 | try { 42 | this.strategies.put(entry.getKey(),(Strategy)Class.forName(entry.getValue()).newInstance()); 43 | } catch (Exception e) { 44 | System.out.println("实例化策略出错"+e); 45 | } 46 | } 47 | } 48 | 49 | } 50 | 51 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/framework/mybatisStrategy/strategy/Strategy.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.framework.mybatisStrategy.strategy; 2 | 3 | /** 4 | * 分表策略服务接口 5 | * @author mmzsit 6 | * 7 | */ 8 | public interface Strategy { 9 | 10 | /** 11 | * 传入表名 和分表参数 12 | * @param tableName 13 | * @param splitParam 14 | * @return 15 | */ 16 | String returnTableName(String tableName,String splitParam); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/framework/mybatisStrategy/strategy/impl/YYYYMM01Strategy.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.framework.mybatisStrategy.strategy.impl; 2 | 3 | import com.java.mmzsit.framework.mybatisStrategy.framework.util.DateUtil; 4 | import com.java.mmzsit.framework.mybatisStrategy.strategy.Strategy; 5 | 6 | import java.text.ParseException; 7 | /** 8 | * @author :mmzsit 9 | * @description:按月分表策略 10 | * @date :2019/6/13 10:29 11 | */ 12 | public class YYYYMM01Strategy implements Strategy { 13 | 14 | @Override 15 | public String returnTableName(String tableName, String param) { 16 | try { 17 | // 结果类似 20190601 18 | return tableName+"_"+ DateUtil.get_MM01Str(param); 19 | } catch (ParseException e) { 20 | e.printStackTrace(); 21 | return tableName; 22 | } 23 | } 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/framework/util/DateUtil.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.framework.mybatisStrategy.framework.util; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Calendar; 6 | import java.util.Date; 7 | 8 | /** 9 | * @author :mmzsit 10 | * @description: 11 | * @date :2019/6/13 10:32 12 | */ 13 | public class DateUtil { 14 | private static SimpleDateFormat sdf; 15 | 16 | /** 17 | * 获取当前时间yyyyMMddHHmm 18 | */ 19 | public static String getCurrentDate(String pattern) { 20 | sdf = new SimpleDateFormat(pattern); 21 | String curDate = sdf.format(new Date()); 22 | return curDate; 23 | } 24 | 25 | /** 26 | * 获取昨天的时间yyyyMMdd 27 | */ 28 | public static String getLastDate() { 29 | sdf = new SimpleDateFormat("yyyyMMdd"); 30 | Calendar ca = Calendar.getInstance();//得到一个Calendar的实例 31 | ca.setTime(new Date()); //设置时间为当前时间 32 | ca.add(Calendar.DATE, -1); //年份减1 33 | Date lastDay = ca.getTime(); //结果 34 | return sdf.format(lastDay); 35 | } 36 | 37 | /** 38 | * 获取当前时间 39 | */ 40 | public static Date getCurrentDateAndTime() { 41 | sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); 42 | String curDate = sdf.format(new Date()); 43 | try { 44 | return sdf.parse(curDate); 45 | } catch (ParseException e) { 46 | e.printStackTrace(); 47 | } 48 | return null; 49 | } 50 | 51 | /** 52 | * 获取当前时间并转化为类似20190601的格式 53 | * @param dataStr 54 | * @return 55 | * @throws ParseException 56 | */ 57 | public static String get_MM01Str(String dataStr) throws ParseException { 58 | return getStrByDateFormat("yyyyMM01", getDatebyFormaterStr("yyyyMMdd", dataStr)); 59 | } 60 | public static Date getDatebyFormaterStr(String formater, String dateStr) throws ParseException { 61 | SimpleDateFormat sdf = new SimpleDateFormat(formater); 62 | return sdf.parse(dateStr); 63 | } 64 | 65 | public static String getStrByDateFormat(String formater, Date date) { 66 | SimpleDateFormat sdf = new SimpleDateFormat(formater); 67 | return sdf.format(date); 68 | } 69 | 70 | 71 | /** 72 | * 测试 73 | * @param args 74 | * @throws ParseException 75 | */ 76 | public static void main(String[] args) throws ParseException { 77 | 78 | String currentTime = DateUtil.getCurrentDate("yyyy-MM-dd HH:mm"); 79 | System.out.println("current:" + currentTime); 80 | String currentDate = DateUtil.getCurrentDate("yyyy-MM-dd HH:mm:ss"); 81 | System.out.println("currenDate:" + currentDate); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/service/AddData.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.service; 2 | 3 | import com.java.mmzsit.entity.TestDatas; 4 | 5 | /** 6 | * @author :mmzsit 7 | * @description: 8 | * @date :2019/6/13 10:49 9 | */ 10 | public interface AddData { 11 | /** 12 | * 向数据库插入数据 13 | * @param datas 14 | * @return 更新条数 15 | */ 16 | int add(TestDatas datas); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/java/mmzsit/service/impl/AddDataImpl.java: -------------------------------------------------------------------------------- 1 | package com.java.mmzsit.service.impl; 2 | 3 | import com.java.mmzsit.dao.TestdatasDao; 4 | import com.java.mmzsit.entity.TestDatas; 5 | import com.java.mmzsit.service.AddData; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Service; 8 | 9 | import javax.annotation.Resource; 10 | 11 | /** 12 | * @author :mmzsit 13 | * @description: 14 | * @date :2019/6/13 10:57 15 | */ 16 | @Service 17 | @Slf4j(topic="数据插入分表【AddDataImpl】") 18 | public class AddDataImpl implements AddData { 19 | 20 | @Resource 21 | TestdatasDao testdatasDao; 22 | 23 | /** 24 | * 25 | * @param datas 26 | * @return 影响数据条数 27 | */ 28 | @Override 29 | public int add(TestDatas datas) { 30 | 31 | int flunceNum = testdatasDao.insert(datas); 32 | if(0 != flunceNum){ 33 | log.info("插入数据成功"); 34 | }else { 35 | log.info("插入数据失败"); 36 | } 37 | 38 | return flunceNum; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8001 3 | name: springboot-mybatis-interceptor-on-the-database-level-table 4 | # 设置tomcat相关配置 5 | tomcat: 6 | # 最大工作线程数 7 | max-threads: 520 8 | # 初始化时创建的最小工作线程数 9 | min-spare-threads: 10 10 | # 最大链接数 11 | max-connections: 520 12 | 13 | mybatis: 14 | #config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 15 | #type-aliases-package: com.chinasofti.huateng.common.entities # 所有Entity别名类所在包 16 | mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件 17 | 18 | spring: 19 | application: 20 | name: springboot-mybatis-interceptor-on-the-database-level-table 21 | datasource: 22 | type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 23 | druid: 24 | driver-class-name: com.mysql.jdbc.Driver # mysql驱动包 25 | # mysql数据库 地址;账户;密码 26 | url: jdbc:mysql://localhost:3306/test 27 | username: root 28 | password: 123456 29 | filters: stat,wall,slf4j 30 | initial-size: 5 31 | max-active: 10 32 | min-idle: 5 33 | max-wait: 30000 34 | pool-prepared-statements: true 35 | max-pool-prepared-statement-per-connection-size: 20 36 | validation-query: SELECT 1 FROM DUAL 37 | validation-query-timeout: 60000 38 | test-on-borrow: false 39 | test-on-return: false 40 | test-while-idle: true 41 | time-between-eviction-runs-millis: 60000 42 | min-evictable-idle-time-millis: 100000 43 | # 设置 druid 监控界面的相关信息 44 | stat-view-servlet: 45 | enabled: true 46 | url-pattern: /druid/* 47 | reset-enable: false 48 | login-username: admin 49 | login-password: admin -------------------------------------------------------------------------------- /src/main/resources/application-prod.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8001 3 | name: springboot-mybatis-interceptor-on-the-database-level-table 4 | # 设置tomcat相关配置 5 | tomcat: 6 | # 最大工作线程数 7 | max-threads: 520 8 | # 初始化时创建的最小工作线程数 9 | min-spare-threads: 10 10 | # 最大链接数 11 | max-connections: 520 12 | 13 | mybatis: 14 | #config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 15 | #type-aliases-package: com.chinasofti.huateng.common.entities # 所有Entity别名类所在包 16 | mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件 17 | 18 | spring: 19 | application: 20 | name: springboot-mybatis-interceptor-on-the-database-level-table 21 | datasource: 22 | type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 23 | druid: 24 | driver-class-name: oracle.jdbc.driver.OracleDriver # oracle驱动包 25 | # 生产数据库 地址;账户;密码 26 | url: jdbc:oracle:thin:@127.0.0.1:1521/ORCL 27 | username: mmzsit 28 | password: mmzsit 29 | filters: stat,wall,slf4j 30 | initial-size: 5 31 | max-active: 10 32 | min-idle: 5 33 | max-wait: 30000 34 | pool-prepared-statements: true 35 | max-pool-prepared-statement-per-connection-size: 20 36 | validation-query: SELECT 1 FROM DUAL 37 | validation-query-timeout: 60000 38 | test-on-borrow: false 39 | test-on-return: false 40 | test-while-idle: true 41 | time-between-eviction-runs-millis: 60000 42 | min-evictable-idle-time-millis: 100000 43 | # 设置 druid 监控界面的相关信息 44 | stat-view-servlet: 45 | enabled: true 46 | url-pattern: /druid/* 47 | reset-enable: false 48 | login-username: admin 49 | login-password: admin -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | # 测试环境 4 | # active: dev 5 | # 生产环境 6 | active: prod -------------------------------------------------------------------------------- /src/main/resources/createTable/create.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE 2 | TESTDATAS_20190701 3 | ( 4 | ID NUMBER(4) NOT NULL, 5 | NAME NVARCHAR2(30), 6 | AGE NVARCHAR2(2), 7 | INFORMATION NVARCHAR2(30), 8 | UPDATEDATE NVARCHAR2(14), 9 | PRIMARY KEY (ID) 10 | ); -------------------------------------------------------------------------------- /src/main/resources/generatorConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 58 |
59 | 60 | 61 |
62 |
-------------------------------------------------------------------------------- /src/main/resources/jar/mysql-connector-java-5.1.42.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mmzsblog/springboot-mybatisInterceptor/a3af12f34724fb5f55eae13eb96146ea7f67fae1/src/main/resources/jar/mysql-connector-java-5.1.42.jar -------------------------------------------------------------------------------- /src/main/resources/jar/ojdbc6-11.2.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mmzsblog/springboot-mybatisInterceptor/a3af12f34724fb5f55eae13eb96146ea7f67fae1/src/main/resources/jar/ojdbc6-11.2.0.3.jar -------------------------------------------------------------------------------- /src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | D:/logs 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 19 | 20 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 45 | 47 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /src/main/resources/mapper/TestdatasMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ID, NAME, AGE, INFORMATION, UPDATEDATE 13 | 14 | 15 | 16 | insert into TESTDATAS (ID, NAME, AGE, INFORMATION, 17 | UPDATEDATE) 18 | values (#{id,jdbcType=INTEGER}, 19 | #{name,jdbcType=VARCHAR}, 20 | #{age,jdbcType=VARCHAR}, 21 | #{information,jdbcType=VARCHAR}, 22 | #{updatedate,jdbcType=VARCHAR}) 23 | 24 | 25 | -------------------------------------------------------------------------------- /target/classes/application-dev.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8001 3 | name: springboot-mybatis-interceptor-on-the-database-level-table 4 | # 设置tomcat相关配置 5 | tomcat: 6 | # 最大工作线程数 7 | max-threads: 520 8 | # 初始化时创建的最小工作线程数 9 | min-spare-threads: 10 10 | # 最大链接数 11 | max-connections: 520 12 | 13 | mybatis: 14 | #config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 15 | #type-aliases-package: com.chinasofti.huateng.common.entities # 所有Entity别名类所在包 16 | mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件 17 | 18 | spring: 19 | application: 20 | name: springboot-mybatis-interceptor-on-the-database-level-table 21 | datasource: 22 | type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 23 | druid: 24 | driver-class-name: com.mysql.jdbc.Driver # mysql驱动包 25 | # mysql数据库 地址;账户;密码 26 | url: jdbc:mysql://localhost:3306/test 27 | username: root 28 | password: 123456 29 | filters: stat,wall,slf4j 30 | initial-size: 5 31 | max-active: 10 32 | min-idle: 5 33 | max-wait: 30000 34 | pool-prepared-statements: true 35 | max-pool-prepared-statement-per-connection-size: 20 36 | validation-query: SELECT 1 FROM DUAL 37 | validation-query-timeout: 60000 38 | test-on-borrow: false 39 | test-on-return: false 40 | test-while-idle: true 41 | time-between-eviction-runs-millis: 60000 42 | min-evictable-idle-time-millis: 100000 43 | # 设置 druid 监控界面的相关信息 44 | stat-view-servlet: 45 | enabled: true 46 | url-pattern: /druid/* 47 | reset-enable: false 48 | login-username: admin 49 | login-password: admin -------------------------------------------------------------------------------- /target/classes/application-prod.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8001 3 | name: springboot-mybatis-interceptor-on-the-database-level-table 4 | # 设置tomcat相关配置 5 | tomcat: 6 | # 最大工作线程数 7 | max-threads: 520 8 | # 初始化时创建的最小工作线程数 9 | min-spare-threads: 10 10 | # 最大链接数 11 | max-connections: 520 12 | 13 | mybatis: 14 | #config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 15 | #type-aliases-package: com.chinasofti.huateng.common.entities # 所有Entity别名类所在包 16 | mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件 17 | 18 | spring: 19 | application: 20 | name: springboot-mybatis-interceptor-on-the-database-level-table 21 | datasource: 22 | type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 23 | druid: 24 | driver-class-name: oracle.jdbc.driver.OracleDriver # oracle驱动包 25 | # 生产数据库 地址;账户;密码 26 | url: jdbc:oracle:thin:@127.0.0.1:1521/ORCL 27 | username: mmzsit 28 | password: mmzsit 29 | filters: stat,wall,slf4j 30 | initial-size: 5 31 | max-active: 10 32 | min-idle: 5 33 | max-wait: 30000 34 | pool-prepared-statements: true 35 | max-pool-prepared-statement-per-connection-size: 20 36 | validation-query: SELECT 1 FROM DUAL 37 | validation-query-timeout: 60000 38 | test-on-borrow: false 39 | test-on-return: false 40 | test-while-idle: true 41 | time-between-eviction-runs-millis: 60000 42 | min-evictable-idle-time-millis: 100000 43 | # 设置 druid 监控界面的相关信息 44 | stat-view-servlet: 45 | enabled: true 46 | url-pattern: /druid/* 47 | reset-enable: false 48 | login-username: admin 49 | login-password: admin -------------------------------------------------------------------------------- /target/classes/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | # 测试环境 4 | # active: dev 5 | # 生产环境 6 | active: prod -------------------------------------------------------------------------------- /target/classes/createTable/create.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE 2 | TESTDATAS_20190701 3 | ( 4 | ID NUMBER(4) NOT NULL, 5 | NAME NVARCHAR2(30), 6 | AGE NVARCHAR2(2), 7 | INFORMATION NVARCHAR2(30), 8 | UPDATEDATE NVARCHAR2(14), 9 | PRIMARY KEY (ID) 10 | ); -------------------------------------------------------------------------------- /target/classes/generatorConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 58 |
59 | 60 | 61 |
62 |
-------------------------------------------------------------------------------- /target/classes/jar/mysql-connector-java-5.1.42.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mmzsblog/springboot-mybatisInterceptor/a3af12f34724fb5f55eae13eb96146ea7f67fae1/target/classes/jar/mysql-connector-java-5.1.42.jar -------------------------------------------------------------------------------- /target/classes/jar/ojdbc6-11.2.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mmzsblog/springboot-mybatisInterceptor/a3af12f34724fb5f55eae13eb96146ea7f67fae1/target/classes/jar/ojdbc6-11.2.0.3.jar -------------------------------------------------------------------------------- /target/classes/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | D:/logs 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 19 | 20 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 45 | 47 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /target/classes/mapper/TestdatasMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ID, NAME, AGE, INFORMATION, UPDATEDATE 13 | 14 | 15 | 16 | insert into TESTDATAS (ID, NAME, AGE, INFORMATION, 17 | UPDATEDATE) 18 | values (#{id,jdbcType=INTEGER}, 19 | #{name,jdbcType=VARCHAR}, 20 | #{age,jdbcType=VARCHAR}, 21 | #{information,jdbcType=VARCHAR}, 22 | #{updatedate,jdbcType=VARCHAR}) 23 | 24 | 25 | -------------------------------------------------------------------------------- /target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst: -------------------------------------------------------------------------------- 1 | com\java\mmzsit\entity\TestDatas.class 2 | com\java\mmzsit\config\StrategyConfig.class 3 | com\java\mmzsit\controller\TableController.class 4 | com\java\mmzsit\service\AddData.class 5 | com\java\mmzsit\framework\mybatisStrategy\StrategyManager.class 6 | com\java\mmzsit\framework\mybatisStrategy\strategy\impl\YYYYMM01Strategy.class 7 | com\java\mmzsit\framework\annotation\TableSplitRule.class 8 | com\java\mmzsit\config\DataSourceConfig.class 9 | com\java\mmzsit\framework\mybatisStrategy\framework\util\DateUtil.class 10 | com\java\mmzsit\framework\annotation\TableSplitTarget.class 11 | com\java\mmzsit\SubTableApplication.class 12 | com\java\mmzsit\config\InterceptConfig.class 13 | com\java\mmzsit\entity\TestDatas$TestDatasBuilder.class 14 | com\java\mmzsit\framework\interceptor\TableSplitInterceptor.class 15 | com\java\mmzsit\framework\mybatisStrategy\strategy\Strategy.class 16 | com\java\mmzsit\dao\TestdatasDao.class 17 | com\java\mmzsit\service\impl\AddDataImpl.class 18 | -------------------------------------------------------------------------------- /target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst: -------------------------------------------------------------------------------- 1 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\framework\util\DateUtil.java 2 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\service\impl\AddDataImpl.java 3 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\controller\TableController.java 4 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\framework\mybatisStrategy\StrategyManager.java 5 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\service\AddData.java 6 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\framework\annotation\TableSplitTarget.java 7 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\config\InterceptConfig.java 8 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\SubTableApplication.java 9 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\config\DataSourceConfig.java 10 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\dao\TestdatasDao.java 11 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\framework\mybatisStrategy\strategy\impl\YYYYMM01Strategy.java 12 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\framework\annotation\TableSplitRule.java 13 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\framework\mybatisStrategy\strategy\Strategy.java 14 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\config\StrategyConfig.java 15 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\entity\TestDatas.java 16 | D:\WorkspaceGit\springboot-mybatisInterceptor\src\main\java\com\java\mmzsit\framework\interceptor\TableSplitInterceptor.java 17 | --------------------------------------------------------------------------------