diff --git a/README.md b/README.md index a7268b1418486..09214ac51fa6a 100644 --- a/README.md +++ b/README.md @@ -122,11 +122,12 @@ ## 规则配置 `Sharding-JDBC`的分库分表通过规则配置描述,请简单浏览配置全貌: ```java - ShardingRule shardingRule = new ShardingRule( - dataSourceRule, - Arrays.asList(tableRule), - new DatabaseShardingStrategy("sharding_column_1", new XXXShardingAlgorithm()), - new TableShardingStrategy("sharding_column_2", new XXXShardingAlgorithm())); + ShardingRule shardingRule = ShardingRule.builder() + .dataSourceRule(dataSourceRule) + .tableRules(tableRules) + .databaseShardingStrategy(new DatabaseShardingStrategy("sharding_column_1", new XXXShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("sharding_column_2", new XXXShardingAlgorithm()))) + .build(); ``` 规则配置包括数据源配置、表规则配置、分库策略和分表策略组成。这只是最简单的配置方式,实际使用可更加灵活,如:多分片键,分片策略直接和`tableRule`绑定等。 diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java index 4641aac683e3a..7bbd4dc453559 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java @@ -21,10 +21,6 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; -import com.dangdang.ddframe.rdb.sharding.router.strategy.MultipleKeysShardingAlgorithm; -import com.dangdang.ddframe.rdb.sharding.router.strategy.ShardingAlgorithm; -import com.dangdang.ddframe.rdb.sharding.router.strategy.ShardingStrategy; -import com.dangdang.ddframe.rdb.sharding.router.strategy.SingleKeyShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.MultipleKeysDatabaseShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm; @@ -38,6 +34,10 @@ import com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm.ClosureDatabaseShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm.ClosureTableShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.config.common.internal.parser.InlineParser; +import com.dangdang.ddframe.rdb.sharding.router.strategy.MultipleKeysShardingAlgorithm; +import com.dangdang.ddframe.rdb.sharding.router.strategy.ShardingAlgorithm; +import com.dangdang.ddframe.rdb.sharding.router.strategy.ShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.router.strategy.SingleKeyShardingAlgorithm; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -83,9 +83,9 @@ public ShardingRuleBuilder(final String logRoot, final ShardingRuleConfig shardi public ShardingRule build() { DataSourceRule dataSourceRule = buildDataSourceRule(); Collection tableRules = buildTableRules(dataSourceRule); - return new ShardingRule(dataSourceRule, tableRules, buildBindingTableRules(tableRules), - buildShardingStrategy(shardingRuleConfig.getDefaultDatabaseStrategy(), DatabaseShardingStrategy.class), - buildShardingStrategy(shardingRuleConfig.getDefaultTableStrategy(), TableShardingStrategy.class)); + return ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(tableRules).bindingTableRules(buildBindingTableRules(tableRules)) + .databaseShardingStrategy(buildShardingStrategy(shardingRuleConfig.getDefaultDatabaseStrategy(), DatabaseShardingStrategy.class)) + .tableShardingStrategy(buildShardingStrategy(shardingRuleConfig.getDefaultTableStrategy(), TableShardingStrategy.class)).build(); } private DataSourceRule buildDataSourceRule() { @@ -96,17 +96,13 @@ private DataSourceRule buildDataSourceRule() { private Collection buildTableRules(final DataSourceRule dataSourceRule) { Collection result = new ArrayList<>(shardingRuleConfig.getTables().size()); for (Entry each : shardingRuleConfig.getTables().entrySet()) { - TableRule tableRule; - if (null == each.getValue().getActualTables()) { - tableRule = new TableRule(each.getKey(), dataSourceRule, - buildShardingStrategy(each.getValue().getDatabaseStrategy(), DatabaseShardingStrategy.class), - buildShardingStrategy(each.getValue().getTableStrategy(), TableShardingStrategy.class)); - } else { - tableRule = new TableRule(each.getKey(), new InlineParser(each.getValue().getActualTables()).evaluate(), dataSourceRule, - buildShardingStrategy(each.getValue().getDatabaseStrategy(), DatabaseShardingStrategy.class), - buildShardingStrategy(each.getValue().getTableStrategy(), TableShardingStrategy.class)); + TableRule.TableRuleBuilder tableRuleBuilder = TableRule.builder(each.getKey()).dataSourceRule(dataSourceRule).dynamic(each.getValue().isDynamic()) + .databaseShardingStrategy(buildShardingStrategy(each.getValue().getDatabaseStrategy(), DatabaseShardingStrategy.class)) + .tableShardingStrategy(buildShardingStrategy(each.getValue().getTableStrategy(), TableShardingStrategy.class)); + if (null != each.getValue().getActualTables()) { + tableRuleBuilder.actualTables(new InlineParser(each.getValue().getActualTables()).evaluate()); } - result.add(tableRule); + result.add(tableRuleBuilder.build()); } return result; } diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java index afaaeec938615..6d4ebf189441c 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java @@ -29,6 +29,8 @@ @Setter public class TableRuleConfig { + private boolean dynamic; + private String actualTables; private StrategyConfig databaseStrategy; diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java index 870f0bd13e979..7b54ced064bec 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java @@ -32,5 +32,4 @@ InlineParserTest.class }) public class AllTests { - } diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilderTest.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilderTest.java index 9b6f76d8d6d2c..b974c6f7cfa9b 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilderTest.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilderTest.java @@ -22,6 +22,7 @@ import java.util.Map; import javax.sql.DataSource; +import com.dangdang.ddframe.rdb.sharding.api.rule.DynamicDataNode; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; import com.dangdang.ddframe.rdb.sharding.config.common.api.config.ShardingRuleConfig; @@ -33,7 +34,9 @@ import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsCollectionContaining.hasItem; import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; @Slf4j public class ShardingRuleBuilderTest { @@ -58,6 +61,35 @@ public void testMin() { assertThat(shardingRule.getTableRules().size(), is(1)); } + @Test + public void testDynamic() { + Yaml yaml = new Yaml(new Constructor(ShardingRuleConfig.class)); + Map dsMap = new HashMap<>(); + dsMap.put("ds", new BasicDataSource()); + ShardingRuleConfig config = (ShardingRuleConfig) yaml.load(ShardingRuleBuilderTest.class.getResourceAsStream("/config/config-dynamic.yaml")); + ShardingRule shardingRule = new ShardingRuleBuilder("config-dynamic.yaml", dsMap, config).build(); + int i = 0; + for (TableRule each : shardingRule.getTableRules()) { + i++; + assertThat(each.getActualTables().size(), is(2)); + assertThat(each.getActualTables(), hasItem(new DynamicDataNode("db0"))); + assertThat(each.getActualTables(), hasItem(new DynamicDataNode("db1"))); + switch (i) { + case 1: + assertThat(each.getLogicTable(), is("config")); + break; + case 2: + assertThat(each.getLogicTable(), is("t_order")); + break; + case 3: + assertThat(each.getLogicTable(), is("t_order_item")); + break; + default: + fail(); + } + } + } + @Test(expected = IllegalArgumentException.class) public void testClassNotFound() { Yaml yaml = new Yaml(new Constructor(ShardingRuleConfig.class)); diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/resources/config/config-dynamic.yaml b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/resources/config/config-dynamic.yaml new file mode 100644 index 0000000000000..94cd3853f9daa --- /dev/null +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/resources/config/config-dynamic.yaml @@ -0,0 +1,40 @@ +dataSource: + db0: !!org.apache.commons.dbcp.BasicDataSource + driverClassName: org.h2.Driver + url: jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL + username: sa + password: + maxActive: 100 + db1: !!org.apache.commons.dbcp.BasicDataSource + driverClassName: org.h2.Driver + url: jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL + username: sa + password: + maxActive: 100 + +tables: + config: + dynamic: true + + t_order: + dynamic: true + databaseStrategy: &db001 + shardingColumns: order_id + algorithmClassName: com.dangdang.ddframe.rdb.sharding.config.common.internal.fixture.SingleAlgorithm + tableStrategy: &table001 + shardingColumns: id + algorithmExpression: t_order_${id.longValue() % 2} + + t_order_item: + dynamic: true + #绑定表中其余的表的策略与第一张表的策略相同 + databaseStrategy: *db001 + tableStrategy: *table001 + +#默认数据库分片策略 +defaultDatabaseStrategy: + shardingColumns: order_id, user_id + algorithmExpression: t_order_${id.longValue() % 2} +defaultTableStrategy: + shardingColumns: id, order_id + algorithmClassName: com.dangdang.ddframe.rdb.sharding.config.common.internal.fixture.MultiAlgorithm \ No newline at end of file diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java index 5d555bc9eb426..81d49a29a13ad 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java @@ -46,6 +46,8 @@ public final class ShardingJdbcDataSourceBeanDefinitionParserTag { public static final String LOGIC_TABLES_ATTR = "logic-tables"; + public static final String DYNAMIC_TABLE_ATTR = "dynamic"; + public static final String ACTUAL_TABLES_ATTR = "actual-tables"; public static final String DATABASE_STRATEGY_ATTR = "database-strategy"; diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java index c7cb9f2a1416e..4d7e1a383915c 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java @@ -88,6 +88,10 @@ private Map parseTableRulesConfig(final Element element) private BeanDefinition parseTableRuleConfig(final Element tableElement) { BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(TableRuleConfig.class); + String dynamic = tableElement.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.DYNAMIC_TABLE_ATTR); + if (!Strings.isNullOrEmpty(dynamic)) { + factory.addPropertyValue("dynamic", dynamic); + } String actualTables = tableElement.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.ACTUAL_TABLES_ATTR); if (!Strings.isNullOrEmpty(actualTables)) { factory.addPropertyValue("actualTables", actualTables); diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd index 435dea588b4db..593b2cd55148d 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd @@ -36,6 +36,7 @@ + diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceAlgorithmExpressionForDynamic.xml b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceAlgorithmExpressionForDynamic.xml index 42c55045d371a..1106eb0f658e6 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceAlgorithmExpressionForDynamic.xml +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceAlgorithmExpressionForDynamic.xml @@ -18,8 +18,8 @@ - - + + diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml index 16a6949f45265..62152864d2fa0 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml @@ -18,7 +18,8 @@ - + + t_order_0 t_order_1 @@ -26,14 +27,15 @@ t_order_3 - - - + + + - + + t_order_item_0 t_order_item_1 @@ -41,9 +43,9 @@ t_order_item_3 - - - + + + @@ -68,6 +70,15 @@ + + + + + + + + + diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml index a1803d4bace61..4ada3cdf47048 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml @@ -17,7 +17,8 @@ - + + t_order_0 t_order_1 @@ -25,12 +26,19 @@ t_order_3 - + + + + + + + - + + t_order_item_0 t_order_item_1 @@ -38,7 +46,13 @@ t_order_item_3 - + + + + + + + @@ -63,8 +77,11 @@ - - + + + + + diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSource.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSource.java index d6c221aaa05cd..b22e148b5d127 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSource.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSource.java @@ -28,6 +28,7 @@ * 已废弃, 请使用ShardingDataSourceFactory创建数据源. 未来版本中将删除此类. *

* + * @deprecated * @author zhangliang */ @Deprecated diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java index 8ec0c80dae542..817e984eaa4c5 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java @@ -23,6 +23,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import lombok.Builder; import lombok.Getter; import java.util.ArrayList; @@ -37,6 +38,7 @@ * @author zhangliang */ @Getter +@Builder public final class ShardingRule { private final DataSourceRule dataSourceRule; @@ -45,42 +47,28 @@ public final class ShardingRule { private final Collection bindingTableRules; - private final DatabaseShardingStrategy databaseShardingStrategy; + private DatabaseShardingStrategy databaseShardingStrategy; - private final TableShardingStrategy tableShardingStrategy; + private TableShardingStrategy tableShardingStrategy; - public ShardingRule(final DataSourceRule dataSourceRule, final Collection tableRules) { - this(dataSourceRule, tableRules, Collections.emptyList(), - new DatabaseShardingStrategy(Collections.emptyList(), new NoneDatabaseShardingAlgorithm()), - new TableShardingStrategy(Collections.emptyList(), new NoneTableShardingAlgorithm())); - } - - public ShardingRule(final DataSourceRule dataSourceRule, final Collection tableRules, final Collection bindingTableRules) { - this(dataSourceRule, tableRules, bindingTableRules, - new DatabaseShardingStrategy(Collections.emptyList(), new NoneDatabaseShardingAlgorithm()), - new TableShardingStrategy(Collections.emptyList(), new NoneTableShardingAlgorithm())); - } - - public ShardingRule(final DataSourceRule dataSourceRule, final Collection tableRules, final DatabaseShardingStrategy databaseShardingStrategy) { - this(dataSourceRule, tableRules, Collections.emptyList(), - databaseShardingStrategy, new TableShardingStrategy(Collections.emptyList(), new NoneTableShardingAlgorithm())); - } - - public ShardingRule(final DataSourceRule dataSourceRule, final Collection tableRules, final TableShardingStrategy tableShardingStrategy) { - this(dataSourceRule, tableRules, Collections.emptyList(), - new DatabaseShardingStrategy(Collections.emptyList(), new NoneDatabaseShardingAlgorithm()), tableShardingStrategy); - } - - public ShardingRule(final DataSourceRule dataSourceRule, final Collection tableRules, + /** + * 全属性构造器. + * + *

用于Spring非命名空间的配置.

+ * + *

未来将改为private权限, 不在对外公开, 不建议使用非Spring命名空间的配置.

+ * + * @deprecated + */ + @Deprecated + public ShardingRule( + final DataSourceRule dataSourceRule, final Collection tableRules, final Collection bindingTableRules, final DatabaseShardingStrategy databaseShardingStrategy, final TableShardingStrategy tableShardingStrategy) { - this(dataSourceRule, tableRules, Collections.emptyList(), databaseShardingStrategy, tableShardingStrategy); - } - - public ShardingRule(final DataSourceRule dataSourceRule, final Collection tableRules, final Collection bindingTableRules, - final DatabaseShardingStrategy databaseShardingStrategy, final TableShardingStrategy tableShardingStrategy) { + Preconditions.checkNotNull(dataSourceRule); + Preconditions.checkNotNull(tableRules); this.dataSourceRule = dataSourceRule; this.tableRules = tableRules; - this.bindingTableRules = bindingTableRules; + this.bindingTableRules = null == bindingTableRules ? Collections.emptyList() : bindingTableRules; this.databaseShardingStrategy = null == databaseShardingStrategy ? new DatabaseShardingStrategy( Collections.emptyList(), new NoneDatabaseShardingAlgorithm()) : databaseShardingStrategy; this.tableShardingStrategy = null == tableShardingStrategy ? new TableShardingStrategy( diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java index 97115b31cf8c2..8076a18e6a676 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java @@ -19,13 +19,14 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; +import com.google.common.base.Preconditions; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.ToString; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -34,7 +35,6 @@ * * @author zhangliang */ -@AllArgsConstructor(access = AccessLevel.PRIVATE) @Getter @ToString public final class TableRule { @@ -45,62 +45,70 @@ public final class TableRule { private final List actualTables; - private DatabaseShardingStrategy databaseShardingStrategy; + private final DatabaseShardingStrategy databaseShardingStrategy; - private TableShardingStrategy tableShardingStrategy; + private final TableShardingStrategy tableShardingStrategy; - public TableRule(final String logicTable, final DataSourceRule dataSourceRule, - final DatabaseShardingStrategy databaseShardingStrategy, final TableShardingStrategy tableShardingStrategy) { - this(logicTable, true, new ArrayList(dataSourceRule.getDataSourceNames().size()), databaseShardingStrategy, tableShardingStrategy); - generateDataNodes(dataSourceRule); - } - - public TableRule(final String logicTable, final DataSourceRule dataSourceRule) { - this(logicTable, dataSourceRule, null, null); - } - - public TableRule(final String logicTable, final DataSourceRule dataSourceRule, final DatabaseShardingStrategy databaseShardingStrategy) { - this(logicTable, dataSourceRule, databaseShardingStrategy, null); - } - - public TableRule(final String logicTable, final DataSourceRule dataSourceRule, final TableShardingStrategy tableShardingStrategy) { - this(logicTable, dataSourceRule, null, tableShardingStrategy); - } - - public TableRule(final String logicTable, final List actualTables, final DataSourceRule dataSourceRule, + /** + * 全属性构造器. + * + *

用于Spring非命名空间的配置.

+ * + *

未来将改为private权限, 不在对外公开, 不建议使用非Spring命名空间的配置.

+ * + * @deprecated + */ + @Deprecated + public TableRule(final String logicTable, final boolean dynamic, final List actualTables, final DataSourceRule dataSourceRule, final DatabaseShardingStrategy databaseShardingStrategy, final TableShardingStrategy tableShardingStrategy) { - this(logicTable, false, new ArrayList(actualTables.size() * dataSourceRule.getDataSourceNames().size()), databaseShardingStrategy, tableShardingStrategy); - generateDataNodes(actualTables, dataSourceRule); - } - - public TableRule(final String logicTable, final List actualTables, final DataSourceRule dataSourceRule) { - this(logicTable, actualTables, dataSourceRule, null, null); - } - - public TableRule(final String logicTable, final List actualTables, final DataSourceRule dataSourceRule, final DatabaseShardingStrategy databaseShardingStrategy) { - this(logicTable, actualTables, dataSourceRule, databaseShardingStrategy, null); + Preconditions.checkNotNull(logicTable); + this.logicTable = logicTable; + this.dynamic = dynamic; + this.databaseShardingStrategy = databaseShardingStrategy; + this.tableShardingStrategy = tableShardingStrategy; + if (dynamic) { + Preconditions.checkNotNull(dataSourceRule); + this.actualTables = generateDataNodes(dataSourceRule); + } else if (null == actualTables || actualTables.isEmpty()) { + Preconditions.checkNotNull(dataSourceRule); + this.actualTables = generateDataNodes(Collections.singletonList(logicTable), dataSourceRule); + } else { + this.actualTables = generateDataNodes(actualTables, dataSourceRule); + } } - public TableRule(final String logicTable, final List actualTables, final DataSourceRule dataSourceRule, final TableShardingStrategy tableShardingStrategy) { - this(logicTable, actualTables, dataSourceRule, null, tableShardingStrategy); + /** + * 获取表规则配置对象构建器. + * + * @param logicTable 逻辑表名称 + * @return 表规则配置对象构建器 + */ + public static TableRuleBuilder builder(final String logicTable) { + return new TableRuleBuilder(logicTable); } - private void generateDataNodes(final DataSourceRule dataSourceRule) { - for (String each : dataSourceRule.getDataSourceNames()) { - actualTables.add(new DynamicDataNode(each)); + private List generateDataNodes(final DataSourceRule dataSourceRule) { + Collection dataSourceNames = dataSourceRule.getDataSourceNames(); + List result = new ArrayList<>(dataSourceNames.size()); + for (String each : dataSourceNames) { + result.add(new DynamicDataNode(each)); } + return result; } - private void generateDataNodes(final List actualTables, final DataSourceRule dataSourceRule) { + private List generateDataNodes(final List actualTables, final DataSourceRule dataSourceRule) { + Collection dataSourceNames = null == dataSourceRule ? Collections.emptyList() : dataSourceRule.getDataSourceNames(); + List result = new ArrayList<>(actualTables.size() * (dataSourceNames.isEmpty() ? 1 : dataSourceNames.size())); for (String actualTable : actualTables) { if (DataNode.isValidDataNode(actualTable)) { - this.actualTables.add(new DataNode(actualTable)); + result.add(new DataNode(actualTable)); } else { - for (String dataSourceName : dataSourceRule.getDataSourceNames()) { - this.actualTables.add(new DataNode(dataSourceName, actualTable)); + for (String dataSourceName : dataSourceNames) { + result.add(new DataNode(dataSourceName, actualTable)); } } } + return result; } /** @@ -174,4 +182,87 @@ int findActualTableIndex(final String dataSourceName, final String actualTableNa } return -1; } + + /** + * 表规则配置对象构建器. + */ + @RequiredArgsConstructor + public static class TableRuleBuilder { + + private final String logicTable; + + private boolean dynamic; + + private List actualTables; + + private DataSourceRule dataSourceRule; + + private DatabaseShardingStrategy databaseShardingStrategy; + + private TableShardingStrategy tableShardingStrategy; + + /** + * 构建是否为动态表. + * + * @param dynamic 是否为动态表 + * @return 真实表集合 + */ + public TableRuleBuilder dynamic(final boolean dynamic) { + this.dynamic = dynamic; + return this; + } + + /** + * 构建真实表集合. + * + * @param actualTables 真实表集合 + * @return 真实表集合 + */ + public TableRuleBuilder actualTables(final List actualTables) { + this.actualTables = actualTables; + return this; + } + + /** + * 构建数据源分片规则. + * + * @param dataSourceRule 数据源分片规则 + * @return 规则配置对象构建器 + */ + public TableRuleBuilder dataSourceRule(final DataSourceRule dataSourceRule) { + this.dataSourceRule = dataSourceRule; + return this; + } + + /** + * 构建数据库分片策略. + * + * @param databaseShardingStrategy 数据库分片策略 + * @return 规则配置对象构建器 + */ + public TableRuleBuilder databaseShardingStrategy(final DatabaseShardingStrategy databaseShardingStrategy) { + this.databaseShardingStrategy = databaseShardingStrategy; + return this; + } + + /** + * 构建表分片策略. + * + * @param tableShardingStrategy 表分片策略 + * @return 规则配置对象构建器 + */ + public TableRuleBuilder tableShardingStrategy(final TableShardingStrategy tableShardingStrategy) { + this.tableShardingStrategy = tableShardingStrategy; + return this; + } + + /** + * 构建表规则配置对象. + * + * @return 表规则配置对象 + */ + public TableRule build() { + return new TableRule(logicTable, dynamic, actualTables, dataSourceRule, databaseShardingStrategy, tableShardingStrategy); + } + } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java index 9811d149c3b10..b5f0197351f55 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java @@ -19,7 +19,6 @@ import com.dangdang.ddframe.rdb.integrate.AbstractDBUnitTest; import com.dangdang.ddframe.rdb.integrate.fixture.MultipleKeysModuloDatabaseShardingAlgorithm; -import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; @@ -27,6 +26,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.NoneTableShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import java.util.Arrays; import java.util.Collections; @@ -68,12 +68,12 @@ protected List getDataSetFiles() { protected final ShardingDataSource getShardingDataSource() { DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); - TableRule orderTableRule = new TableRule("t_order", Collections.singletonList("t_order"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", Collections.singletonList("t_order_item"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("t_order").dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item").dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())).build(); return new ShardingDataSource(shardingRule); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/DynamicShardingBothHelper.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/DynamicShardingBothHelper.java index 15234cef55332..56a93277b0e54 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/DynamicShardingBothHelper.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/DynamicShardingBothHelper.java @@ -19,13 +19,13 @@ import com.dangdang.ddframe.rdb.integrate.fixture.SingleKeyDynamicModuloTableShardingAlgorithm; import com.dangdang.ddframe.rdb.integrate.fixture.SingleKeyModuloDatabaseShardingAlgorithm; -import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -39,12 +39,12 @@ public final class DynamicShardingBothHelper { public static ShardingDataSource getShardingDataSource(final Map dataSourceMap) { DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap); - TableRule orderTableRule = new TableRule("t_order", dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("user_id", new SingleKeyModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new SingleKeyDynamicModuloTableShardingAlgorithm("t_order_"))); + TableRule orderTableRule = TableRule.builder("t_order").dynamic(true).dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item").dynamic(true).dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new SingleKeyModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new SingleKeyDynamicModuloTableShardingAlgorithm("t_order_"))).build(); return new ShardingDataSource(shardingRule); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/StaticShardingBothHelper.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/StaticShardingBothHelper.java index 1ee766db7707b..bfafe7f1eec6d 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/StaticShardingBothHelper.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/StaticShardingBothHelper.java @@ -19,13 +19,13 @@ import com.dangdang.ddframe.rdb.integrate.fixture.SingleKeyModuloDatabaseShardingAlgorithm; import com.dangdang.ddframe.rdb.integrate.fixture.SingleKeyModuloTableShardingAlgorithm; -import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -39,32 +39,32 @@ public final class StaticShardingBothHelper { public static ShardingDataSource getShardingDataSource(final Map dataSourceMap) { DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap); - TableRule orderTableRule = new TableRule("t_order", Arrays.asList( - "t_order_0", - "t_order_1", - "t_order_2", - "t_order_3", - "t_order_4", - "t_order_5", - "t_order_6", - "t_order_7", - "t_order_8", - "t_order_9"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", Arrays.asList( - "t_order_item_0", - "t_order_item_1", - "t_order_item_2", - "t_order_item_3", - "t_order_item_4", - "t_order_item_5", - "t_order_item_6", - "t_order_item_7", - "t_order_item_8", - "t_order_item_9"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("user_id", new SingleKeyModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new SingleKeyModuloTableShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("t_order").actualTables(Arrays.asList( + "t_order_0", + "t_order_1", + "t_order_2", + "t_order_3", + "t_order_4", + "t_order_5", + "t_order_6", + "t_order_7", + "t_order_8", + "t_order_9")).dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item").actualTables(Arrays.asList( + "t_order_item_0", + "t_order_item_1", + "t_order_item_2", + "t_order_item_3", + "t_order_item_4", + "t_order_item_5", + "t_order_item_6", + "t_order_item_7", + "t_order_item_8", + "t_order_item_9")).dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new SingleKeyModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new SingleKeyModuloTableShardingAlgorithm())).build(); return new ShardingDataSource(shardingRule); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java index 7796086e08e80..c03206c4b3570 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java @@ -20,7 +20,6 @@ import com.dangdang.ddframe.rdb.integrate.AbstractDBUnitTest; import com.dangdang.ddframe.rdb.integrate.fixture.MultipleKeysModuloDatabaseShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.HintManager; -import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; @@ -28,7 +27,9 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.NoneTableShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.parser.result.router.Condition; +import com.google.common.collect.Lists; import org.dbunit.DatabaseUnitException; import java.sql.Connection; @@ -73,12 +74,12 @@ protected List getDataSetFiles() { protected final ShardingDataSource getShardingDataSource() { DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); - TableRule orderTableRule = new TableRule("t_order", Collections.singletonList("t_order"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", Collections.singletonList("t_order_item"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("t_order").dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item").dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Lists.newArrayList(orderTableRule, orderItemTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())).build(); return new ShardingDataSource(shardingRule); } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java index c5d397df52b66..b75c3ad2259c8 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java @@ -19,7 +19,6 @@ import com.dangdang.ddframe.rdb.integrate.AbstractDBUnitTest; import com.dangdang.ddframe.rdb.integrate.fixture.MultipleKeysModuloDatabaseShardingAlgorithm; -import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; @@ -27,6 +26,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.NoneTableShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import java.util.Arrays; import java.util.Collections; @@ -68,11 +68,12 @@ protected List getDataSetFiles() { protected final ShardingDataSource getShardingDataSource() { DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); - TableRule orderTableRule = new TableRule("t_order", Collections.singletonList("t_order"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Collections.singletonList(orderTableRule), - Collections.singletonList(new BindingTableRule(Collections.singletonList(orderTableRule))), - new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())); + + TableRule orderTableRule = TableRule.builder("t_order").dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())).build(); return new ShardingDataSource(shardingRule); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java index b74a06e4358aa..832a1d2a15a99 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java @@ -19,7 +19,6 @@ import com.dangdang.ddframe.rdb.integrate.AbstractDBUnitTest; import com.dangdang.ddframe.rdb.integrate.fixture.SingleKeyModuloTableShardingAlgorithm; -import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; @@ -27,6 +26,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.NoneDatabaseShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import java.util.Arrays; import java.util.Collections; @@ -48,32 +48,34 @@ protected List getDataSetFiles() { protected final ShardingDataSource getShardingDataSource() { DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); - TableRule orderTableRule = new TableRule("t_order", Arrays.asList( - "t_order_0", - "t_order_1", - "t_order_2", - "t_order_3", - "t_order_4", - "t_order_5", - "t_order_6", - "t_order_7", - "t_order_8", - "t_order_9"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", Arrays.asList( - "t_order_item_0", - "t_order_item_1", - "t_order_item_2", - "t_order_item_3", - "t_order_item_4", - "t_order_item_5", - "t_order_item_6", - "t_order_item_7", - "t_order_item_8", - "t_order_item_9"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("user_id", new NoneDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new SingleKeyModuloTableShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("t_order").actualTables(Arrays.asList( + "t_order_0", + "t_order_1", + "t_order_2", + "t_order_3", + "t_order_4", + "t_order_5", + "t_order_6", + "t_order_7", + "t_order_8", + "t_order_9")).dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item").actualTables(Arrays.asList( + "t_order_item_0", + "t_order_item_1", + "t_order_item_2", + "t_order_item_3", + "t_order_item_4", + "t_order_item_5", + "t_order_item_6", + "t_order_item_7", + "t_order_item_8", + "t_order_item_9")).dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder() + .dataSourceRule(dataSourceRule) + .tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new NoneDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new SingleKeyModuloTableShardingAlgorithm())).build(); return new ShardingDataSource(shardingRule); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSourceFactoryTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSourceFactoryTest.java index 9032a7dd6f017..bc5ba525f499e 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSourceFactoryTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/ShardingDataSourceFactoryTest.java @@ -66,7 +66,8 @@ private ShardingRule createShardingRule() throws SQLException { Map dataSourceMap = new HashMap<>(1); dataSourceMap.put("ds", dataSource); DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap); - return new ShardingRule(dataSourceRule, Collections.singletonList(new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), dataSourceRule))); + TableRule tableRule = TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(dataSourceRule).build(); + return ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Collections.singletonList(tableRule)).build(); } private ShardingRule getShardingRule(final DataSource dataSource) throws NoSuchFieldException, IllegalAccessException { diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/BindingTableRuleTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/BindingTableRuleTest.java index 2160409a51256..137900209445b 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/BindingTableRuleTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/BindingTableRuleTest.java @@ -76,11 +76,12 @@ private BindingTableRule createBindingTableRule() { } private TableRule createTableRule() { - return new TableRule("logicTable", Arrays.asList("ds1.table_0", "ds1.table_1", "ds2.table_0", "ds2.table_1"), createDataSourceRule()); + return TableRule.builder("logicTable").actualTables(Arrays.asList("ds1.table_0", "ds1.table_1", "ds2.table_0", "ds2.table_1")).dataSourceRule(createDataSourceRule()).build(); } private TableRule createSubTableRule() { - return new TableRule("subLogicTable", Arrays.asList("ds1.sub_table_0", "ds1.sub_table_1", "ds2.sub_table_0", "ds2.sub_table_1"), createDataSourceRule()); + return TableRule.builder("subLogicTable").actualTables(Arrays.asList("ds1.sub_table_0", "ds1.sub_table_1", "ds2.sub_table_0", "ds2.sub_table_1")) + .dataSourceRule(createDataSourceRule()).build(); } private DataSourceRule createDataSourceRule() { @@ -95,10 +96,10 @@ private BindingTableRule createDynamicBindingTableRule() { } private TableRule createDynamicTableRule() { - return new TableRule("logicTable", createDataSourceRule()); + return TableRule.builder("logicTable").dynamic(true).dataSourceRule(createDataSourceRule()).build(); } private TableRule createDynamicSubTableRule() { - return new TableRule("subLogicTable", createDataSourceRule()); + return TableRule.builder("subLogicTable").dynamic(true).dataSourceRule(createDataSourceRule()).build(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java index e403b8c241234..165e24b7c52ab 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java @@ -41,7 +41,7 @@ public final class ShardingRuleTest { @Test public void assertShardingRuleWithoutStrategy() { - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule())); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()).tableRules(Collections.singletonList(createTableRule())).build(); assertTrue(actual.getDatabaseShardingStrategy().getShardingColumns().isEmpty()); assertTrue(actual.getTableShardingStrategy().getShardingColumns().isEmpty()); } @@ -55,28 +55,36 @@ public void assertShardingRuleWithBindingTableRuleWithoutStrategy() { @Test public void assertShardingRuleWithDatabaseStrategy() { - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule()), createDatabaseShardingStrategy()); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(createTableRule())).databaseShardingStrategy(createDatabaseShardingStrategy()).build(); assertThat(actual.getDatabaseShardingStrategy().getShardingColumns().size(), is(1)); assertTrue(actual.getTableShardingStrategy().getShardingColumns().isEmpty()); } @Test public void assertShardingRuleWithTableStrategy() { - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule()), createTableShardingStrategy()); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(createTableRule())).tableShardingStrategy(createTableShardingStrategy()).build(); assertThat(actual.getTableShardingStrategy().getShardingColumns().size(), is(1)); assertTrue(actual.getDatabaseShardingStrategy().getShardingColumns().isEmpty()); } @Test public void assertShardingRuleWithoutBindingTableRule() { - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule()), createDatabaseShardingStrategy(), createTableShardingStrategy()); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(createTableRule())) + .databaseShardingStrategy(createDatabaseShardingStrategy()) + .tableShardingStrategy(createTableShardingStrategy()).build(); assertThat(actual.getDatabaseShardingStrategy().getShardingColumns().size(), is(1)); assertThat(actual.getTableShardingStrategy().getShardingColumns().size(), is(1)); } @Test public void assertFindTableRule() { - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule()), createDatabaseShardingStrategy(), createTableShardingStrategy()); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(createTableRule())) + .databaseShardingStrategy(createDatabaseShardingStrategy()) + .tableShardingStrategy(createTableShardingStrategy()).build(); assertTrue(actual.findTableRule("logicTable").isPresent()); assertFalse(actual.findTableRule("null").isPresent()); } @@ -85,7 +93,7 @@ public void assertFindTableRule() { public void assertGetDatabaseShardingStrategyFromTableRule() { DatabaseShardingStrategy strategy = createDatabaseShardingStrategy(); TableRule tableRule = createTableRule(strategy); - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(tableRule)); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()).tableRules(Collections.singletonList(createTableRule())).build(); assertThat(actual.getDatabaseShardingStrategy(tableRule), is(strategy)); } @@ -93,15 +101,16 @@ public void assertGetDatabaseShardingStrategyFromTableRule() { public void assertGetDatabaseShardingStrategyFromDefault() { DatabaseShardingStrategy strategy = createDatabaseShardingStrategy(); TableRule tableRule = createTableRule(); - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(tableRule), strategy); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(createTableRule())).databaseShardingStrategy(strategy).build(); assertThat(actual.getDatabaseShardingStrategy(tableRule), is(strategy)); } @Test public void assertGetDatabaseShardingStrategyForNullValue() { - DatabaseShardingStrategy strategy = null; TableRule tableRule = createTableRule(); - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(tableRule), strategy); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(tableRule)).databaseShardingStrategy(null).build(); assertNotNull(actual.getDatabaseShardingStrategy(tableRule)); } @@ -109,7 +118,7 @@ public void assertGetDatabaseShardingStrategyForNullValue() { public void assertGetTableShardingStrategyFromTableRule() { TableShardingStrategy strategy = createTableShardingStrategy(); TableRule tableRule = createTableRule(strategy); - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(tableRule)); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()).tableRules(Collections.singletonList(tableRule)).build(); assertThat(actual.getTableShardingStrategy(tableRule), is(strategy)); } @@ -117,21 +126,20 @@ public void assertGetTableShardingStrategyFromTableRule() { public void assertGetTableShardingStrategyFromDefault() { TableShardingStrategy strategy = createTableShardingStrategy(); TableRule tableRule = createTableRule(); - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(tableRule), strategy); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()).tableRules(Collections.singletonList(tableRule)).tableShardingStrategy(strategy).build(); assertThat(actual.getTableShardingStrategy(tableRule), is(strategy)); } @Test public void assertGetTableShardingStrategyForNullValue() { - TableShardingStrategy strategy = null; TableRule tableRule = createTableRule(); - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(tableRule), strategy); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()).tableRules(Collections.singletonList(tableRule)).tableShardingStrategy(null).build(); assertNotNull(actual.getTableShardingStrategy(tableRule)); } @Test public void assertGetBindingTableRuleForNotConfig() { - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule())); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()).tableRules(Collections.singletonList(createTableRule())).build(); assertFalse(actual.findBindingTableRule("logicTable").isPresent()); } @@ -143,7 +151,8 @@ public void assertGetBindingTableRuleForNotFound() { @Test public void assertGetBindingTableRuleForFound() { BindingTableRule bindingTableRule = createBindingTableRule(); - ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule()), Collections.singletonList(bindingTableRule)); + ShardingRule actual = ShardingRule.builder().dataSourceRule(createDataSourceRule()).tableRules(Collections.singletonList(createTableRule())) + .bindingTableRules(Collections.singletonList(bindingTableRule)).build(); assertThat(actual.findBindingTableRule("logicTable").get(), is(bindingTableRule)); } @@ -194,7 +203,8 @@ public void assertGetAllShardingColumnsWithStrategy() { } private ShardingRule createShardingRule() { - return new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule()), Collections.singletonList(createBindingTableRule())); + return ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(createTableRule())).bindingTableRules(Collections.singletonList(createBindingTableRule())).build(); } private DataSourceRule createDataSourceRule() { @@ -205,15 +215,15 @@ private DataSourceRule createDataSourceRule() { } private TableRule createTableRule() { - return new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), createDataSourceRule()); + return TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(createDataSourceRule()).build(); } private TableRule createTableRule(final DatabaseShardingStrategy strategy) { - return new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), createDataSourceRule(), strategy); + return TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(createDataSourceRule()).databaseShardingStrategy(strategy).build(); } private TableRule createTableRule(final TableShardingStrategy strategy) { - return new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), createDataSourceRule(), strategy); + return TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(createDataSourceRule()).tableShardingStrategy(strategy).build(); } private BindingTableRule createBindingTableRule() { @@ -221,7 +231,7 @@ private BindingTableRule createBindingTableRule() { } private TableRule createSubTableRule() { - return new TableRule("subLogicTable", Arrays.asList("sub_table_0", "sub_table_1", "sub_table_2"), createDataSourceRule()); + return TableRule.builder("subLogicTable").actualTables(Arrays.asList("sub_table_0", "sub_table_1", "sub_table_2")).dataSourceRule(createDataSourceRule()).build(); } private DatabaseShardingStrategy createDatabaseShardingStrategy() { @@ -233,10 +243,12 @@ private TableShardingStrategy createTableShardingStrategy() { } private ShardingRule createShardingRuleWithStrategy() { - return new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRuleWithAllStrategies()), Collections.singletonList(createBindingTableRule())); + return ShardingRule.builder().dataSourceRule(createDataSourceRule()) + .tableRules(Collections.singletonList(createTableRuleWithAllStrategies())).bindingTableRules(Collections.singletonList(createBindingTableRule())).build(); } private TableRule createTableRuleWithAllStrategies() { - return new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), createDataSourceRule(), createDatabaseShardingStrategy(), createTableShardingStrategy()); + return TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(createDataSourceRule()) + .databaseShardingStrategy(createDatabaseShardingStrategy()).tableShardingStrategy(createTableShardingStrategy()).build(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java index b8daf32b25638..9ff8532449e0c 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java @@ -41,7 +41,7 @@ public final class TableRuleTest { @Test public void assertTableRuleForDynamicWithoutAnyStrategies() { - TableRule actual = new TableRule("logicTable", createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable").dynamic(true).dataSourceRule(createDataSourceRule()).build(); assertDynamicTable(actual); assertNull(actual.getDatabaseShardingStrategy()); assertNull(actual.getTableShardingStrategy()); @@ -49,7 +49,8 @@ public void assertTableRuleForDynamicWithoutAnyStrategies() { @Test public void assertTableRuleForDynamicWithDatabaseStrategy() { - TableRule actual = new TableRule("logicTable", createDataSourceRule(), new DatabaseShardingStrategy("", new NoneDatabaseShardingAlgorithm())); + TableRule actual = TableRule.builder("logicTable").dynamic(true).dataSourceRule(createDataSourceRule()) + .databaseShardingStrategy(new DatabaseShardingStrategy("", new NoneDatabaseShardingAlgorithm())).build(); assertDynamicTable(actual); assertNotNull(actual.getDatabaseShardingStrategy()); assertNull(actual.getTableShardingStrategy()); @@ -57,7 +58,8 @@ public void assertTableRuleForDynamicWithDatabaseStrategy() { @Test public void assertTableRuleForDynamicWithTableStrategy() { - TableRule actual = new TableRule("logicTable", createDataSourceRule(), new TableShardingStrategy("", new NoneTableShardingAlgorithm())); + TableRule actual = TableRule.builder("logicTable").dynamic(true).dataSourceRule(createDataSourceRule()) + .tableShardingStrategy(new TableShardingStrategy("", new NoneTableShardingAlgorithm())).build(); assertDynamicTable(actual); assertNull(actual.getDatabaseShardingStrategy()); assertNotNull(actual.getTableShardingStrategy()); @@ -65,8 +67,9 @@ public void assertTableRuleForDynamicWithTableStrategy() { @Test public void assertTableRuleForDynamicWithAllStrategies() { - TableRule actual = new TableRule("logicTable", createDataSourceRule(), - new DatabaseShardingStrategy("", new NoneDatabaseShardingAlgorithm()), new TableShardingStrategy("", new NoneTableShardingAlgorithm())); + TableRule actual = TableRule.builder("logicTable").dynamic(true).dataSourceRule(createDataSourceRule()) + .databaseShardingStrategy(new DatabaseShardingStrategy("", new NoneDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("", new NoneTableShardingAlgorithm())).build(); assertDynamicTable(actual); assertNotNull(actual.getDatabaseShardingStrategy()); assertNotNull(actual.getTableShardingStrategy()); @@ -80,7 +83,7 @@ private void assertDynamicTable(final TableRule actual) { @Test public void assertTableRuleWithoutDataNode() { - TableRule actual = new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(createDataSourceRule()).build(); assertActualTable(actual); assertNull(actual.getDatabaseShardingStrategy()); assertNull(actual.getTableShardingStrategy()); @@ -88,7 +91,8 @@ public void assertTableRuleWithoutDataNode() { @Test public void assertTableRuleWithDatabaseShardingStrategyWithoutDataNode() { - TableRule actual = new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), createDataSourceRule(), new DatabaseShardingStrategy("", new NoneDatabaseShardingAlgorithm())); + TableRule actual = TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(createDataSourceRule()) + .databaseShardingStrategy(new DatabaseShardingStrategy("", new NoneDatabaseShardingAlgorithm())).build(); assertActualTable(actual); assertNotNull(actual.getDatabaseShardingStrategy()); assertNull(actual.getTableShardingStrategy()); @@ -96,7 +100,8 @@ public void assertTableRuleWithDatabaseShardingStrategyWithoutDataNode() { @Test public void assertTableRuleWithTableShardingStrategyWithoutDataNode() { - TableRule actual = new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), createDataSourceRule(), new TableShardingStrategy("", new NoneTableShardingAlgorithm())); + TableRule actual = TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(createDataSourceRule()) + .tableShardingStrategy(new TableShardingStrategy("", new NoneTableShardingAlgorithm())).build(); assertActualTable(actual); assertNull(actual.getDatabaseShardingStrategy()); assertNotNull(actual.getTableShardingStrategy()); @@ -104,7 +109,8 @@ public void assertTableRuleWithTableShardingStrategyWithoutDataNode() { @Test public void assertTableRuleWithDataNodeString() { - TableRule actual = new TableRule("logicTable", Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable") + .actualTables(Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2")).build(); assertActualTable(actual); assertNull(actual.getDatabaseShardingStrategy()); assertNull(actual.getTableShardingStrategy()); @@ -122,45 +128,51 @@ private void assertActualTable(final TableRule actual) { @Test public void assertGetActualDataNodesForStatic() { - TableRule actual = new TableRule("logicTable", Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable") + .actualTables(Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2")).build(); assertThat(actual.getActualDataNodes(Collections.singletonList("ds1"), Arrays.asList("table_0", "table_1")), is( (Collection) Sets.newLinkedHashSet(Arrays.asList(new DataNode("ds1", "table_0"), new DataNode("ds1", "table_1"))))); } @Test public void assertGetActualDataNodesForDynamic() { - TableRule actual = new TableRule("logicTable", createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable").dynamic(true).dataSourceRule(createDataSourceRule()).build(); assertThat(actual.getActualDataNodes(Collections.singletonList("ds1"), Arrays.asList("table_0", "table_1")), is( (Collection) Sets.newLinkedHashSet(Arrays.asList(new DataNode("ds1", "table_0"), new DataNode("ds1", "table_1"))))); } @Test public void assertGetActualDatasourceNames() { - TableRule actual = new TableRule("logicTable", Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable") + .actualTables(Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2")).build(); assertThat(actual.getActualDatasourceNames(), is((Collection) Sets.newLinkedHashSet(Arrays.asList("ds0", "ds1")))); } @Test public void assertGetActualTableNames() { - TableRule actual = new TableRule("logicTable", Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable") + .actualTables(Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2")).build(); assertThat(actual.getActualTableNames(Collections.singletonList("ds1")), is((Collection) Sets.newLinkedHashSet(Arrays.asList("table_0", "table_1", "table_2")))); } @Test public void assertFindActualTableIndex() { - TableRule actual = new TableRule("logicTable", Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable") + .actualTables(Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2")).build(); assertThat(actual.findActualTableIndex("ds1", "table_1"), is(4)); } @Test public void assertFindActualTableIndexForNotFound() { - TableRule actual = new TableRule("logicTable", Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable") + .actualTables(Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2")).build(); assertThat(actual.findActualTableIndex("ds2", "table_2"), is(-1)); } @Test public void assertToString() { - TableRule actual = new TableRule("logicTable", Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2"), createDataSourceRule()); + TableRule actual = TableRule.builder("logicTable") + .actualTables(Arrays.asList("ds0.table_0", "ds0.table_1", "ds0.table_2", "ds1.table_0", "ds1.table_1", "ds1.table_2")).build(); assertThat(actual.toString(), is("TableRule(logicTable=logicTable, dynamic=false, actualTables=[" + "DataNode(dataSourceName=ds0, tableName=table_0), " + "DataNode(dataSourceName=ds0, tableName=table_1), " diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSourceTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSourceTest.java index 0018093655ef2..af711228c7f47 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSourceTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSourceTest.java @@ -66,6 +66,8 @@ private ShardingDataSource createShardingDataSource(final DataSource dataSource) Map dataSourceMap = new HashMap<>(1); dataSourceMap.put("ds", dataSource); DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap); - return new ShardingDataSource(new ShardingRule(dataSourceRule, Collections.singletonList(new TableRule("logicTable", Arrays.asList("table_0", "table_1", "table_2"), dataSourceRule)))); + TableRule tableRule = TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")).dataSourceRule(dataSourceRule).build(); + return new ShardingDataSource(ShardingRule.builder() + .dataSourceRule(dataSourceRule).tableRules(Collections.singletonList(tableRule)).build()); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/AbstractBaseParseTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/AbstractBaseParseTest.java index 76e1eff6e9838..2dcba615e699b 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/AbstractBaseParseTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/AbstractBaseParseTest.java @@ -158,8 +158,8 @@ public Comparable apply(final Value input) { @Override public OrderByColumn apply(final com.dangdang.ddframe.rdb.sharding.parser.jaxb.OrderByColumn input) { - return Strings.isNullOrEmpty(input.getName()) ? new OrderByColumn(input.getIndex(), OrderByType.valueOf(input.getOrderByType().toUpperCase())) : - new OrderByColumn(Optional.fromNullable(input.getOwner()), input.getName(), + return Strings.isNullOrEmpty(input.getName()) ? new OrderByColumn(input.getIndex(), OrderByType.valueOf(input.getOrderByType().toUpperCase())) + : new OrderByColumn(Optional.fromNullable(input.getOwner()), input.getName(), Optional.fromNullable(input.getAlias()), OrderByType.valueOf(input.getOrderByType().toUpperCase())); } })); @@ -169,7 +169,8 @@ public OrderByColumn apply(final com.dangdang.ddframe.rdb.sharding.parser.jaxb.O @Override public GroupByColumn apply(final com.dangdang.ddframe.rdb.sharding.parser.jaxb.GroupByColumn input) { - return new GroupByColumn(Optional.fromNullable(input.getOwner()), input.getName(), Optional.fromNullable(input.getAlias()), OrderByType.valueOf(input.getOrderByType().toUpperCase())); + return new GroupByColumn( + Optional.fromNullable(input.getOwner()), input.getName(), Optional.fromNullable(input.getAlias()), OrderByType.valueOf(input.getOrderByType().toUpperCase())); } })); } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java index 3db999c9bee10..3fec25b206376 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/router/AbstractBaseRouteSqlTest.java @@ -17,23 +17,13 @@ package com.dangdang.ddframe.rdb.sharding.router; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import javax.sql.DataSource; - -import com.dangdang.ddframe.rdb.sharding.constants.DatabaseType; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; +import com.dangdang.ddframe.rdb.sharding.constants.DatabaseType; import com.dangdang.ddframe.rdb.sharding.exception.SQLParserException; import com.dangdang.ddframe.rdb.sharding.router.fixture.OrderAttrShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.router.fixture.OrderShardingAlgorithm; @@ -44,6 +34,16 @@ import lombok.Getter; import org.junit.Before; +import javax.sql.DataSource; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -59,13 +59,14 @@ public void setRouteRuleContext() { dataSourceMap.put("ds_0", null); dataSourceMap.put("ds_1", null); DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap); - TableRule orderTableRule = new TableRule("order", Lists.newArrayList("order_0", "order_1"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("order_item", Lists.newArrayList("order_item_0", "order_item_1"), dataSourceRule); - TableRule orderAttrTableRule = new TableRule("order_attr", Lists.newArrayList("ds_0.order_attr_a", "ds_1.order_attr_b"), dataSourceRule, - new TableShardingStrategy("order_id", new OrderAttrShardingAlgorithm())); - shardingRule = new ShardingRule(dataSourceRule, Lists.newArrayList(orderTableRule, orderItemTableRule, orderAttrTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("order_id", new OrderShardingAlgorithm()), new TableShardingStrategy("order_id", new OrderShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("order").actualTables(Lists.newArrayList("order_0", "order_1")).dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("order_item").actualTables(Lists.newArrayList("order_item_0", "order_item_1")).dataSourceRule(dataSourceRule).build(); + TableRule orderAttrTableRule = TableRule.builder("order_attr").actualTables(Lists.newArrayList("ds_0.order_attr_a", "ds_1.order_attr_b")).dataSourceRule(dataSourceRule) + .tableShardingStrategy(new TableShardingStrategy("order_id", new OrderAttrShardingAlgorithm())).build(); + shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Lists.newArrayList(orderTableRule, orderItemTableRule, orderAttrTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy("order_id", new OrderShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new OrderShardingAlgorithm())).build(); } protected void assertSingleTarget(final String originSql, final String targetDataSource, final String targetSQL) throws SQLParserException { diff --git a/sharding-jdbc-doc/content/post/configuration.md b/sharding-jdbc-doc/content/post/configuration.md index 0663d19b883af..fe7fd8c4e7709 100644 --- a/sharding-jdbc-doc/content/post/configuration.md +++ b/sharding-jdbc-doc/content/post/configuration.md @@ -81,7 +81,8 @@ dataSource: 数据源配置 tables: 分库分表配置,可配置多个logic_table_name : 逻辑表名 - actualTables: 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源。不填写表示动态表配置。 + dynamic: 是否为动态表 + actualTables: 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源。不填写表示为只分库不分表或动态表(需要配置dynamic=true)。 databaseStrategy: 分库策略 shardingColumns: 分片列名,多个列以逗号分隔 algorithmClassName: 分库算法全类名,该类需使用默认的构造器或者提供无参数的构造器,与algorithmExpression出现一个即可 @@ -216,7 +217,8 @@ props: 属性配置(可选) | *名称* | *类型* | *数据类型* | *必填* | *说明* | | -------------------- | ------------ | ---------- | ------ | ------- | | logic-table | 属性 | String | 是 | 逻辑表名 | -| actual-tables | 属性 | String | 否 | 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源 指定数据源需要加前缀,不加前缀为默认数据源。不填写表示使用动态表配置 | +| dynamic | 属性 | boolean | 否 | 是否动态表 | +| actual-tables | 属性 | String | 否 | 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源 指定数据源需要加前缀,不加前缀为默认数据源。不填写表示为只分库不分表或动态表(需要配置dynamic=true) | | database-strategy | 属性 | String | 否 | 分库策略,对应``中分库策略id, 如果不填需配置`` | | table-strategy | 属性 | String | 否 | 分表策略,对应``中分表策略id, 如果不填需配置`` | diff --git a/sharding-jdbc-doc/content/post/release_notes.md b/sharding-jdbc-doc/content/post/release_notes.md index 32a50119a3031..4f5f84b54eecd 100644 --- a/sharding-jdbc-doc/content/post/release_notes.md +++ b/sharding-jdbc-doc/content/post/release_notes.md @@ -11,12 +11,15 @@ weight = 1 ### 结构调整 1. [ISSUE #60](https://github.com/dangdangdotcom/sharding-jdbc/issues/60) API调整,抽离ShardingDataSource,使用工厂代替 +1. [ISSUE #76](https://github.com/dangdangdotcom/sharding-jdbc/issues/76) ShardingRule和TableRule调整为Builder模式 +1. [ISSUE #77](https://github.com/dangdangdotcom/sharding-jdbc/issues/77) ShardingRule和TableRule调整为Builder模式 ### 功能提升 1. [ISSUE #61](https://github.com/dangdangdotcom/sharding-jdbc/issues/61) 在ShardingValue类中加入逻辑表名 1. [ISSUE #66](https://github.com/dangdangdotcom/sharding-jdbc/issues/66) 在JDBC层的Statement增加对get/set MaxFieldSize,MaxRows和QueryTimeout的支持 1. [ISSUE #72](https://github.com/dangdangdotcom/sharding-jdbc/issues/72) 对于select union all形式的批量插入支持 +1. [ISSUE #78](https://github.com/dangdangdotcom/sharding-jdbc/issues/78) 简化只分库配置,无需配置逻辑表和真实表对应关系 ### 缺陷修正 diff --git a/sharding-jdbc-doc/content/post/user_guide.md b/sharding-jdbc-doc/content/post/user_guide.md index 9ffd4c9bb02c2..1970996755fcd 100644 --- a/sharding-jdbc-doc/content/post/user_guide.md +++ b/sharding-jdbc-doc/content/post/user_guide.md @@ -80,10 +80,12 @@ select * from db0.t_order_0 where user_id = ? and order_id = ?; ## 规则配置 以上分库分表的形式`Sharding-JDBC`是通过规则配置来进行的描述的,下面讲通过几个小节来描述规则的详细配置: ```java - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Arrays.asList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())); + ShardingRule shardingRule = ShardingRule.builder() + .dataSourceRule(dataSourceRule) + .tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))) + .build(); ``` ## 数据源配置 首先我们来构造`DataSourceRule`对象,它是来描述数据源的分布规则的。 @@ -119,34 +121,52 @@ Sharding-JDBC认为对于分片策略存有两种维度 ### 全局默认策略与特定表策略 策略是作用在特定的表规则上的,数据源策略与表策略与特定表相关 ```java -TableRule orderTableRule = new TableRule("t_order", Arrays.asList("t_order_0", "t_order_1"), - new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()), - dataSourceRule); + TableRule orderTableRule = TableRule.builder("t_order") + .actualTables(Arrays.asList("t_order_0", "t_order_1") + .dataSourceRule(dataSourceRule) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))) + .build(); ``` -如果分片规则中的所有表或大部分表的分片策略相同,可以使用默认策略来简化配置。一下两种配置是等价的 +如果分片规则中的所有表或大部分表的分片策略相同,可以使用默认策略来简化配置。以下两种配置是等价的: ```java //使用了默认策略配置 - TableRule orderTableRule = new TableRule("t_order", Arrays.asList("t_order_0", "t_order_1"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", Arrays.asList("t_order_item_0", "t_order_item_1"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Arrays.asList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("t_order") + .actualTables(Arrays.asList("t_order_0", "t_order_1") + .dataSourceRule(dataSourceRule) + .build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item") + .actualTables(Arrays.asList("t_order_item_0", "t_order_item_1") + .dataSourceRule(dataSourceRule) + .build(); + ShardingRule shardingRule = ShardingRule.builder() + .dataSourceRule(dataSourceRule) + .tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))) + .build(); ``` ```java //未使用默认策略配置 - TableRule orderTableRule = new TableRule("t_order", Arrays.asList("t_order_0", "t_order_1"), dataSourceRule, - new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())); - TableRule orderItemTableRule = new TableRule("t_order_item", Arrays.asList("t_order_item_0", "t_order_item_1"), dataSourceRule, - new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Arrays.asList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))); + TableRule orderTableRule = TableRule.builder("t_order") + .actualTables(Arrays.asList("t_order_0", "t_order_1") + .dataSourceRule(dataSourceRule) + .build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item") + .actualTables(Arrays.asList("t_order_item_0", "t_order_item_1") + .dataSourceRule(dataSourceRule) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))) + .build(); + ShardingRule shardingRule = ShardingRule.builder() + .dataSourceRule(dataSourceRule) + .tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))) + .build(); ``` ### 分片键 diff --git a/sharding-jdbc-example/sharding-jdbc-example-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/sharding/example/transaction/Main.java b/sharding-jdbc-example/sharding-jdbc-example-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/sharding/example/transaction/Main.java index 0b1c80c8ff31d..2162555fe0fff 100644 --- a/sharding-jdbc-example/sharding-jdbc-example-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/sharding/example/transaction/Main.java +++ b/sharding-jdbc-example/sharding-jdbc-example-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/sharding/example/transaction/Main.java @@ -82,12 +82,12 @@ private static void updateFailure(final DataSource dataSource) throws SQLExcepti private static DataSource getShardingDataSource() { DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap()); - TableRule orderTableRule = new TableRule("t_order", Arrays.asList("t_order_0", "t_order_1"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", Arrays.asList("t_order_item_0", "t_order_item_1"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("t_order").actualTables(Arrays.asList("t_order_0", "t_order_1")).dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item").actualTables(Arrays.asList("t_order_item_0", "t_order_item_1")).dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())).build(); return ShardingDataSourceFactory.createDataSource(shardingRule); } diff --git a/sharding-jdbc-example/sharding-jdbc-example-jdbc/src/main/java/com/dangdang/ddframe/rdb/sharding/example/jdbc/Main.java b/sharding-jdbc-example/sharding-jdbc-example-jdbc/src/main/java/com/dangdang/ddframe/rdb/sharding/example/jdbc/Main.java index 08d589531b8d8..b0db354fc7646 100644 --- a/sharding-jdbc-example/sharding-jdbc-example-jdbc/src/main/java/com/dangdang/ddframe/rdb/sharding/example/jdbc/Main.java +++ b/sharding-jdbc-example/sharding-jdbc-example-jdbc/src/main/java/com/dangdang/ddframe/rdb/sharding/example/jdbc/Main.java @@ -18,7 +18,6 @@ package com.dangdang.ddframe.rdb.sharding.example.jdbc; import com.dangdang.ddframe.rdb.sharding.api.HintManager; -import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; @@ -27,6 +26,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; import com.dangdang.ddframe.rdb.sharding.example.jdbc.algorithm.ModuloDatabaseShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.example.jdbc.algorithm.ModuloTableShardingAlgorithm; +import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.apache.commons.dbcp.BasicDataSource; import javax.sql.DataSource; @@ -102,12 +102,12 @@ private static void printHintSimpleSelect(final DataSource dataSource) throws SQ private static ShardingDataSource getShardingDataSource() { DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap()); - TableRule orderTableRule = new TableRule("t_order", Arrays.asList("t_order_0", "t_order_1"), dataSourceRule); - TableRule orderItemTableRule = new TableRule("t_order_item", Arrays.asList("t_order_item_0", "t_order_item_1"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Arrays.asList(orderTableRule, orderItemTableRule), - Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))), - new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()), - new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())); + TableRule orderTableRule = TableRule.builder("t_order").actualTables(Arrays.asList("t_order_0", "t_order_1")).dataSourceRule(dataSourceRule).build(); + TableRule orderItemTableRule = TableRule.builder("t_order_item").actualTables(Arrays.asList("t_order_item_0", "t_order_item_1")).dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) + .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) + .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm())) + .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())).build(); return new ShardingDataSource(shardingRule); } diff --git a/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/test/java/com/dangdang/ddframe/rdb/transaction/soft/base/AbstractSoftTransactionIntegrationTest.java b/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/test/java/com/dangdang/ddframe/rdb/transaction/soft/base/AbstractSoftTransactionIntegrationTest.java index 8f97d2654128d..7757475487ef8 100644 --- a/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/test/java/com/dangdang/ddframe/rdb/transaction/soft/base/AbstractSoftTransactionIntegrationTest.java +++ b/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/test/java/com/dangdang/ddframe/rdb/transaction/soft/base/AbstractSoftTransactionIntegrationTest.java @@ -48,8 +48,8 @@ public void setup() throws SQLException { private void prepareEnv() throws SQLException { DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap()); - TableRule tableRule = new TableRule("transaction_test", Lists.newArrayList("transaction_test"), dataSourceRule); - ShardingRule shardingRule = new ShardingRule(dataSourceRule, Lists.newArrayList(tableRule)); + TableRule tableRule = TableRule.builder("transaction_test").dataSourceRule(dataSourceRule).build(); + ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Lists.newArrayList(tableRule)).build(); shardingDataSource = new ShardingDataSource(shardingRule); createTable(shardingDataSource); transactionDataSource = createTransactionLogDataSource();