引文:Sharding-Jdbc是通过ShardingDataSourceFactory工厂通过规则配置获取对象ShardingDataSource,ShardingDataSource实现了自JDBC标准的DataSource接口,然后程序可以通过ShardingDataSource选择使用原生的JDBC或者使用JPA,MyBatis等ORM框架进行操作数据库的开发
0.pom文件-说明Sharding-JDBC版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<sharding-sphere.version>3.0.0.M4</sharding-sphere.version>
<mybatis.version>3.4.2</mybatis.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
<spring-framework.version>4.3.6.RELEASE</spring-framework.version>
<mysql-connector-java.version>5.1.42</mysql-connector-java.version>
<slf4j.version>1.7.7</slf4j.version>
<logback.version>1.2.0</logback.version>
<commons-dbcp.version>1.4</commons-dbcp.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>${sharding-sphere.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
1.分片规则配置文件类——ShardingRuleConfiguration
属性名称 | 数据类型 | 说明 |
---|---|---|
tableRuleConfigs | Collection<TableRuleConfiguration> | 分片规则列表,是集合类型,可以配置多张表的 分片规则 |
bindingTableGroups | Collection<String> | 绑定表规则列表 , 关联多表查询的时候避免笛卡尔积的组合出现 |
defaultDatabaseShardingStrategyConfig | ShardingStrategyConfiguration | 默认分库策略 |
defaultTableShardingStrategyConfig | ShardingStrategyConfiguration | 默认分表策略 |
defaultKeyGeneratorClass | String | 默认自增列值生成器,缺省使用 io.shardingjdbc.core.keygen.DefaultKeyGenerator |
masterSlaveRuleConfigs | Collection<MasterSlaveRuleConfiguration> | 读写分离规则,缺省表示不使用读写分离 |
// 分库策略 - > 采用 user_id%2 来进行分库 主要定位数据库
// user_id是偶数存储到 0库
// user_id是奇数存储到 1库
shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(
new InlineShardingStrategyConfiguration(
"user_id",
"orders_${user_id%2}")
);
// 分表策略 - > 分片字段 使用 order_id
shardingRuleConfig.setDefaultTableShardingStrategyConfig(
new StandardShardingStrategyConfiguration(
"order_id",
new PreciseShardingAlgorithm<Long>() {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
for(String targetName : availableTargetNames){
String modVal = String.valueOf((shardingValue.getValue() % 2));
//奇数订单保存到1表
//偶数订单保存到0表
if(targetName.endsWith(modVal)){
return targetName;
}
}
throw new UnsupportedOperationException();
}
}
)
);
2.表分片规则配置类——TableRuleConfiguration
属性名称 | 数据类型 | 说明 |
---|---|---|
logicTable | String | 逻辑表名称 |
actualDataNodes | String | 1) 由数据源名 + 表名组成 以小数点分割,多个表以逗号隔开,支持inline表达式 2) 缺省时,以已知 数据源名称和逻辑表名称生成数据节点 3)用于广播表 --即每个库中都需要一个同样的表进行关联查询,多为字典表 4)只分库不分表且所有库的表结构完全一致的情况 |
databaseShardingStrategyConfig | ShardingStrategyConfiguration | 默认分库策略 缺省表示使用默认分库策略, 即ShardingRuleConfiguration中配置的分库策略 |
tableShardingStrategyConfig | ShardingStrategyConfiguration | 默认分表策略 缺省表示使用默认分表策略 |
keyGeneratorColumnName | String | 自增列 名称,缺省表示不使用自增主键生成器 |
keyGeneratorClass | String | 自增列值生成器,缺省表示使用默认自增主键生成器 |
logicIndex | String | 逻辑索引名称 |
/**
* 也就说配置,
* 1) 有多少个库
* 2) 逻辑表名
* 3) 库名和表名的对应关系
* 4) 分片键
* @return
*/
private static TableRuleConfiguration constOrderTableRuleConfig(){
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration();
// 逻辑表
tableRuleConfig.setLogicTable("t_order");
// 物理表
// orders_${0..1} - > orders_0 orders_1 数据库名
// t_order_${0..1} - > t_order_0 t_order_1 表名
// 数据库名和表名使用 . 连接符连接起来
String actualDataNode = "orders_${0..1}.t_order_${0..1}";
tableRuleConfig.setActualDataNodes(actualDataNode);
// 分片键列名 - 订单ID
tableRuleConfig.setKeyGeneratorColumnName("order_id");
return tableRuleConfig;
}
3.创建数据源
Properties prop = new Properties();
//打印SQL语句
prop.setProperty("sql.show","true");
DataSource dataSource = ShardingDataSourceFactory.createDataSource(
dataSourceMap,// 多数据源信息
shardingRuleConfig,// 分库分表规则配置
new ConcurrentHashMap<>(),
prop);