diff --git a/build.gradle b/build.gradle index c310201..8304a48 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ uploadArchives { authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) } pom.project { - version '2.1.46' + version '2.1.48' artifactId ARTIFACT_Id groupId GROUP_ID packaging TYPE diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplate.java b/src/main/java/com/taover/repository/CustomJdbcTemplate.java index d16c4ed..cc053d9 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplate.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplate.java @@ -18,6 +18,7 @@ import javax.persistence.Table; import org.springframework.jdbc.core.JdbcTemplate; +import com.taover.repository.mapper.CustomJdbcTemplateRowMapper; import com.taover.repository.util.UtilsSql; /** diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateRowMapper.java b/src/main/java/com/taover/repository/CustomJdbcTemplateRowMapper.java deleted file mode 100644 index a1693de..0000000 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateRowMapper.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.taover.repository; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSetMetaData; - -public class CustomJdbcTemplateRowMapper implements RowMapper{ - Log log = LogFactory.getLog(this.getClass()); - - private Map beanFielNameToField = new HashMap(); - private Method beforeMethod = null; - private Method afterMethod = null; - - private Class classInfo; - private Map tableToBeanMap; - - public CustomJdbcTemplateRowMapper(Class classInfo, Map tableToBeanMap) { - this.classInfo = classInfo; - this.tableToBeanMap = tableToBeanMap; - - Field[] fields = this.classInfo.getDeclaredFields(); - for(Field item: fields) { - try { - item.setAccessible(true); - this.beanFielNameToField.put(item.getName(), item); - }catch (Exception e) { - log.error("set field accessible:"+e.getMessage()); - } - } - - boolean hasImplementPointCut = false; - Class[] interfaceArr = this.classInfo.getInterfaces(); - for(int i=0; i Integer convert Long:"+e.getMessage()); - } - }else { - log.error("map set object field error:"+e.getMessage()); - } - } catch (IllegalAccessException e) { - log.error("map set object field error:"+e.getMessage()); - } - } - - if(this.afterMethod != null){ - try { - afterMethod.invoke(targetObj); - }catch (Exception e) { - log.error("invoke after exception:"+e.getMessage()); - } - } - - return targetObj; - } -} diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java index 20ba6a7..f099bd2 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java @@ -22,6 +22,7 @@ import com.taover.repository.exception.NoContainTenantException; import com.taover.repository.exception.NotFoundException; import com.taover.repository.exception.ObjectReflectException; import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant; +import com.taover.repository.mapper.CustomJdbcTemplateRowMapper; import com.taover.repository.util.UtilsSql; /** diff --git a/src/main/java/com/taover/repository/EntityPointCut.java b/src/main/java/com/taover/repository/EntityPointCut.java deleted file mode 100644 index 442ec82..0000000 --- a/src/main/java/com/taover/repository/EntityPointCut.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.taover.repository; - -public interface EntityPointCut { - - public void before(); - - public void after(); -} diff --git a/src/main/java/com/taover/repository/advice/EntityPointCut.java b/src/main/java/com/taover/repository/advice/EntityPointCut.java new file mode 100644 index 0000000..c57eaf7 --- /dev/null +++ b/src/main/java/com/taover/repository/advice/EntityPointCut.java @@ -0,0 +1,8 @@ +package com.taover.repository.advice; + +public interface EntityPointCut { + + public void before(); + + public void after(); +} diff --git a/src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateWrapperTenantImpl.java b/src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateWrapperTenantImpl.java index 4cbeda8..8fdea27 100644 --- a/src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateWrapperTenantImpl.java +++ b/src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateWrapperTenantImpl.java @@ -3,7 +3,6 @@ package com.taover.repository.jdbctemplate; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import javax.annotation.Resource; @@ -26,6 +25,7 @@ import org.springframework.jdbc.core.StatementCallback; import org.springframework.jdbc.support.KeyHolder; import org.springframework.jdbc.support.rowset.SqlRowSet; +import com.taover.repository.shardingsphere.ShardingInfoEntity; import com.taover.repository.shardingsphere.ShardingSphereService; public class JdbcTemplateWrapperTenantImpl implements JdbcTemplateWrapperTenant { @@ -35,13 +35,15 @@ public class JdbcTemplateWrapperTenantImpl implements JdbcTemplateWrapperTenant private ShardingSphereService shardingSphereService; private void loadShardingInfo(Long tenantId) { - Map shardingInfo = this.shardingSphereService.getShardingInfoMapByTenantId(tenantId); + List shardingInfo = this.shardingSphereService.getShardingInfoMapByTenantId(tenantId); if(shardingInfo == null || shardingInfo.isEmpty()) { return; } HintManager.clear(); - for(Entry item: shardingInfo.entrySet()) { - HintManager.getInstance().addTableShardingValue(item.getKey(), item.getValue()); + HintManager instance = HintManager.getInstance(); + for(ShardingInfoEntity item: shardingInfo) { + instance.addTableShardingValue(item.getTableName(), item.getTableSuffix()); + instance.addDatabaseShardingValue(item.getTableName(), item.getDsName()); } } diff --git a/src/main/java/com/taover/repository/mapper/CustomJdbcTemplateRowMapper.java b/src/main/java/com/taover/repository/mapper/CustomJdbcTemplateRowMapper.java new file mode 100644 index 0000000..ac785e3 --- /dev/null +++ b/src/main/java/com/taover/repository/mapper/CustomJdbcTemplateRowMapper.java @@ -0,0 +1,119 @@ +package com.taover.repository.mapper; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSetMetaData; + +public class CustomJdbcTemplateRowMapper implements RowMapper{ + Log log = LogFactory.getLog(this.getClass()); + + private Map beanFielNameToField = new HashMap(); + private Method beforeMethod = null; + private Method afterMethod = null; + + private Class classInfo; + private Map tableToBeanMap; + + public CustomJdbcTemplateRowMapper(Class classInfo, Map tableToBeanMap) { + this.classInfo = classInfo; + this.tableToBeanMap = tableToBeanMap; + + Field[] fields = this.classInfo.getDeclaredFields(); + for(Field item: fields) { + try { + item.setAccessible(true); + this.beanFielNameToField.put(item.getName(), item); + }catch (Exception e) { + log.error("set field accessible:"+e.getMessage()); + } + } + + boolean hasImplementPointCut = false; + Class[] interfaceArr = this.classInfo.getInterfaces(); + for(int i=0; i Integer convert Long:"+e.getMessage()); + } + }else { + log.error("map set object field error:"+e.getMessage()); + } + } catch (IllegalAccessException e) { + log.error("map set object field error:"+e.getMessage()); + } + } + + if(this.afterMethod != null){ + try { + afterMethod.invoke(targetObj); + }catch (Exception e) { + log.error("invoke after exception:"+e.getMessage()); + } + } + + return targetObj; + } +} diff --git a/src/main/java/com/taover/repository/shardingsphere/ShardingAlgorithmHint.java b/src/main/java/com/taover/repository/shardingsphere/ShardingAlgorithmHint.java deleted file mode 100644 index 8135cd5..0000000 --- a/src/main/java/com/taover/repository/shardingsphere/ShardingAlgorithmHint.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.taover.repository.shardingsphere; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm; -import org.apache.shardingsphere.api.sharding.hint.HintShardingValue; - -public class ShardingAlgorithmHint implements HintShardingAlgorithm { - Log log = LogFactory.getLog(ShardingAlgorithmHint.class); - - public ShardingAlgorithmHint() { - System.out.println("ShardingAlgorithmHint()"); - } - - @Override - public Collection doSharding(Collection availableTargetNames, HintShardingValue shardingValue) { - Collection values = shardingValue.getValues(); - if(values == null || values.isEmpty()) { - String message = shardingValue.getLogicTableName()+"已启用分库分表,SQL语句请指定tenant_id 或 使用封装好的DAO层方法"; - log.error(message); - throw new RuntimeException(message); - } - Set result = new HashSet(availableTargetNames); - for(String item: values) { - result.add(shardingValue.getLogicTableName()+item); - } - return result; - } -} diff --git a/src/main/java/com/taover/repository/shardingsphere/ShardingDatabaseAlgorithmHint.java b/src/main/java/com/taover/repository/shardingsphere/ShardingDatabaseAlgorithmHint.java new file mode 100644 index 0000000..793e92c --- /dev/null +++ b/src/main/java/com/taover/repository/shardingsphere/ShardingDatabaseAlgorithmHint.java @@ -0,0 +1,31 @@ +package com.taover.repository.shardingsphere; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm; +import org.apache.shardingsphere.api.sharding.hint.HintShardingValue; + +public class ShardingDatabaseAlgorithmHint implements HintShardingAlgorithm { + Log log = LogFactory.getLog(ShardingDatabaseAlgorithmHint.class); + + public ShardingDatabaseAlgorithmHint() { } + + @Override + public Collection doSharding(Collection availableTargetNames, HintShardingValue shardingValue) { + Collection values = shardingValue.getValues(); + if(values == null || values.isEmpty()) { + String message = shardingValue.getLogicTableName()+"已启用分库分表,SQL语句请指定tenant_id 或 使用封装好的DAO层方法"; + log.error(message); + throw new RuntimeException(message); + } + Set result = new HashSet(1); + for(String item: shardingValue.getValues()) { + result.add(item); + } + return result; + } +} diff --git a/src/main/java/com/taover/repository/shardingsphere/ShardingInfoEntity.java b/src/main/java/com/taover/repository/shardingsphere/ShardingInfoEntity.java index c1aab15..df8e682 100644 --- a/src/main/java/com/taover/repository/shardingsphere/ShardingInfoEntity.java +++ b/src/main/java/com/taover/repository/shardingsphere/ShardingInfoEntity.java @@ -61,16 +61,16 @@ public class ShardingInfoEntity implements Serializable { } /** - * 后缀 + * 表后缀 */ - @Column(name="sharding_suffix") - private java.lang.String shardingSuffix; + @Column(name="table_suffix") + private java.lang.String tableSuffix; - public java.lang.String getShardingSuffix(){ - return shardingSuffix; + public java.lang.String getTableSuffix(){ + return tableSuffix; } - public void setShardingSuffix(java.lang.String shardingSuffix){ - this.shardingSuffix = shardingSuffix; + public void setTableSuffix(java.lang.String tableSuffix){ + this.tableSuffix = tableSuffix; } /** @@ -98,9 +98,22 @@ public class ShardingInfoEntity implements Serializable { public void setUpdateTime(java.sql.Timestamp updateTime){ this.updateTime = updateTime; } + + /** + * 数据库 后缀 + */ + @Column(name="ds_name") + private java.lang.String dsName; + + public java.lang.String getDsName(){ + return dsName; + } + public void setDsName(java.lang.String dsName){ + this.dsName = dsName; + } @Override public String toString() { - return "ShardingInfoEntity: [id="+id+",tableName="+tableName+",tenantId="+tenantId+",shardingSuffix="+shardingSuffix+",createTime="+createTime+",updateTime="+updateTime+"]"; + return "ShardingInfoEntity: [id="+id+",tableName="+tableName+",tenantId="+tenantId+",tableSuffix="+tableSuffix+",createTime="+createTime+",updateTime="+updateTime+",dsName="+dsName+"]"; } } diff --git a/src/main/java/com/taover/repository/shardingsphere/ShardingSphereService.java b/src/main/java/com/taover/repository/shardingsphere/ShardingSphereService.java index 938a537..251d9af 100644 --- a/src/main/java/com/taover/repository/shardingsphere/ShardingSphereService.java +++ b/src/main/java/com/taover/repository/shardingsphere/ShardingSphereService.java @@ -1,5 +1,6 @@ package com.taover.repository.shardingsphere; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -12,7 +13,7 @@ import com.taover.repository.autoconfigure.ShardingSphereKeyGeneratorConfigurati @Service public class ShardingSphereService { - private Map> CACHED_TABLE_SUFFIX_BY_TENANT = null; + private Map> CACHED_TABLE_SUFFIX_BY_TENANT = null; private Map GENERATOR_HOLDER = new HashMap(); @Resource @@ -30,7 +31,7 @@ public class ShardingSphereService { return GENERATOR_HOLDER.get(tableName).generateKeyList(number); } - public Map getShardingInfoMapByTenantId(Long tenantId) { + public List getShardingInfoMapByTenantId(Long tenantId) { if(CACHED_TABLE_SUFFIX_BY_TENANT == null) { loadCacheTableShardingInfoByTenantId(); } @@ -42,10 +43,10 @@ public class ShardingSphereService { return; } List dataList = this.shardingInfoRepository.findListBySql("1=1"); - Map> tempData = new HashMap>(); + Map> tempData = new HashMap>(); for(ShardingInfoEntity item: dataList) { - Map tempItem = tempData.getOrDefault(item.getTenantId(), new HashMap()); - tempItem.put(item.getTableName(), item.getShardingSuffix()); + List tempItem = tempData.getOrDefault(item.getTenantId(), new ArrayList()); + tempItem.add(item); tempData.put(item.getTenantId(), tempItem); } CACHED_TABLE_SUFFIX_BY_TENANT = tempData; diff --git a/src/main/java/com/taover/repository/shardingsphere/ShardingTableAlgorithmHint.java b/src/main/java/com/taover/repository/shardingsphere/ShardingTableAlgorithmHint.java new file mode 100644 index 0000000..eca16ce --- /dev/null +++ b/src/main/java/com/taover/repository/shardingsphere/ShardingTableAlgorithmHint.java @@ -0,0 +1,31 @@ +package com.taover.repository.shardingsphere; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm; +import org.apache.shardingsphere.api.sharding.hint.HintShardingValue; + +public class ShardingTableAlgorithmHint implements HintShardingAlgorithm { + Log log = LogFactory.getLog(ShardingTableAlgorithmHint.class); + + public ShardingTableAlgorithmHint() { } + + @Override + public Collection doSharding(Collection availableTargetNames, HintShardingValue shardingValue) { + Collection values = shardingValue.getValues(); + if(values == null || values.isEmpty()) { + String message = shardingValue.getLogicTableName()+"已启用分库分表,SQL语句请指定tenant_id 或 使用封装好的DAO层方法"; + log.error(message); + throw new RuntimeException(message); + } + Set result = new HashSet(availableTargetNames); + for(String item: values) { + result.add(shardingValue.getLogicTableName()+item); + } + return result; + } +} diff --git a/src/test/java/com/taover/repository/test/TestAutoconfigure.java b/src/test/java/com/taover/repository/test/TestAutoconfigure.java index c96bbc9..093b167 100644 --- a/src/test/java/com/taover/repository/test/TestAutoconfigure.java +++ b/src/test/java/com/taover/repository/test/TestAutoconfigure.java @@ -13,6 +13,7 @@ public class TestAutoconfigure { public static void main(String args[]) { ConfigurableApplicationContext context = SpringApplication.run(TestAutoconfigure.class, args); JdbcTemplateWrapperTenant jdbcTemplate = context.getBean(JdbcTemplateWrapperTenant.class); + System.out.println(jdbcTemplate.queryForObject("select id from wxorder_order limit 1", Long.class, 1L)); System.out.println(jdbcTemplate.queryForList("select * from wxorder_order limit 1", 1L)); System.out.println(jdbcTemplate.queryForList("select * from wxorder_order limit 1", 2L)); System.out.println(jdbcTemplate.queryForList("select * from wxorder_order_express limit 1", 1L)); diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 383c639..7c3dd14 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -16,9 +16,9 @@ spring.mvc.dispatch-options-request=true spring.shardingsphere.datasource.names=ds0 spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver -#spring.shardingsphere.datasource.ds0.url=jdbc:mysql://121.42.142.102:3306/bzyun_wxorder?characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL -#spring.shardingsphere.datasource.ds0.username=dev -#spring.shardingsphere.datasource.ds0.password=taover02 +#spring.shardingsphere.datasource.ds_0.url=jdbc:mysql://121.42.142.102:3306/bzyun_wxorder?characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL +#spring.shardingsphere.datasource.ds_0.username=dev +#spring.shardingsphere.datasource.ds_0.password=taover02 spring.shardingsphere.datasource.ds0.url=jdbc:mysql://rdsifmezqifmezqo.mysql.rds.aliyuncs.com:3306/bzyun_wxorder?characterEncoding=UTF-8 spring.shardingsphere.datasource.ds0.username=tylife spring.shardingsphere.datasource.ds0.password=lexi365 @@ -28,16 +28,14 @@ spring.shardingsphere.datasource.ds0.min-idle=5 spring.shardingsphere.datasource.ds0.max-wait=60000 spring.shardingsphere.sharding.tables.wxorder_order.actual-data-nodes=ds0.wxorder_order -spring.shardingsphere.sharding.tables.wxorder_order.database-strategy.inline.sharding-column=id -spring.shardingsphere.sharding.tables.wxorder_order.database-strategy.inline.algorithm-expression=ds0 -spring.shardingsphere.sharding.tables.wxorder_order.table-strategy.hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingAlgorithmHint +spring.shardingsphere.sharding.tables.wxorder_order.database-strategy.hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingDatabaseAlgorithmHint +spring.shardingsphere.sharding.tables.wxorder_order.table-strategy.hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingTableAlgorithmHint spring.shardingsphere.sharding.tables.wxorder_order.key-generator.column=id spring.shardingsphere.sharding.tables.wxorder_order.key-generator.type=SNOWFLAKE-SELF spring.shardingsphere.sharding.tables.wxorder_order_goods.actual-data-nodes=ds0.wxorder_order_goods -spring.shardingsphere.sharding.tables.wxorder_order_goods.database-strategy.inline.sharding-column=id -spring.shardingsphere.sharding.tables.wxorder_order_goods.database-strategy.inline.algorithm-expression=ds0 -spring.shardingsphere.sharding.tables.wxorder_order.table-strategy.hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingAlgorithmHint +spring.shardingsphere.sharding.tables.wxorder_order_goods.database-strategy.hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingDatabaseAlgorithmHint +spring.shardingsphere.sharding.tables.wxorder_order_goods.table-strategy.hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingTableAlgorithmHint spring.shardingsphere.sharding.tables.wxorder_order_goods.key-generator.column=id spring.shardingsphere.sharding.tables.wxorder_order_goods.key-generator.type=SNOWFLAKE-SELF -- libgit2 0.21.2