话不多说,直接先上代码
pom.xml文件引入依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.0.1</version>
</dependency>
springboot配置文件中加入如下配置
spring:
#shardingsphere配置
#这里先配个比较简单的分表策略,id小于50的进入test1数据源的student_0表,id大于等于50的进入test1数据源的student_1表
shardingsphere:
# 执行语句是是否打印语句,默认为false
# props:
# sql.show: true
#配置需要使用的数据源,如果要配置多个数据源,请参考注释部分
datasource:
names: test1 #,test2
test1:
type: org.springframework.jdbc.datasource.DriverManagerDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test_1?serverTimezone=UTC
username: root
password: admin
# test2:
# type: org.springframework.jdbc.datasource.DriverManagerDataSource
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/test_2?serverTimezone=UTC
# username: root
# password: admin
sharding:
tables: #分库分表策略
# 第一个分表策略
student: #这个key是逻辑表名,即实际sql语句操作的表名,会根据下面的配置路由到其他库的其他表,比如我这里希望让用户操作student表,然后可以自动路由到student_1和student_2
actual-data-nodes: test1.student_$->{1..2} #参与分片的物理表,这里可以写行表达式,如果不用行表达式需要写成 test1.student_1,test.student_2 字符串可以与行表达式组合使用,比如test1.student_1,test1.student_$->{2..3},这里相当于指定了三个表
database-strategy: #分库策略
standard:
sharding-column: id #分库字段
precise-algorithm-class-name: com.student.shardingsphere.range.DatabasePreciseAlgorithm
table-strategy: #分表策略
standard:
sharding-column: id #分表字段
precise-algorithm-class-name: com.student.shardingsphere.range.TablePreciseAlgorithm
# 第二个分表策略
# tableName: # 再配置一组,对tableName这个表的操作进行切分
# actual-data-nodes: test1.tableName_0,test1.tableName_1
# database-strategy:
# standard:
# sharding-column: 分库字段
# precise-algorithm-class-name: 分库算法实现类
# table-strategy:
# standard:
# sharding-column: 分表字段
# precise-algorithm-class-name: 分表算法实现类
分库或分表算法实现类: 需要声明一个类,实现PreciseShardingAlgorithm接口,并重写doSharding方法。之后在配置中指定此类的全限定名即可。以下提供实现模板
分库实现类
//分库实现类 这里泛型的类型根据分库分表字段类型来设置,比如id在数据库为int,这里则泛型为Integer
public class DatabasePreciseAlgorithm implements PreciseShardingAlgorithm<Integer> {
@Override //此处根据实现的接口泛型来泛型
public String doSharding(Collection<String> collection, PreciseShardingValue<Integer> preciseShardingValue) {
/* 我这里只分表不分库,所以直接返回指定的数据源名,如果需要分库,只需要进行一些判断后返回不同的数据源名即可。比如
* if(....){
* return "test1";
* } else {
* return "test2";
* }
* 需要注意的是这里返回的是数据源名不是数据库名
*/
return "test1";
}
}
分表实现类
public class TablePreciseAlgorithm implements PreciseShardingAlgorithm<Integer> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
//System.out.println("分库分表成功");
Integer id = shardingValue.getValue();
if(id < 50 ){
return "student_0";
} else{
return "student_1";
}
}
}
使用shardingSphere时,只要ORM层是基于JDBC的框架(比如myBatis,JPA等),或者是直接使用原生的JDBC,都不用修改任何代码。
我这里是基于官网提供的springBoot配置的形式进行了改良(其实就只是把properties文件的配置改成了yml文件的配置)
官网还支持各种不同的配置形式以及支持不同的功能,秉着无论学什么都以官网提供的文档为准,这里献上官网链接:(官方中文哦)
链接: Apache ShardingSphere.
当然了,作为一个apache的顶级项目功能远远不止如此,如果各位有兴趣了解实现原理以及阅览源码,请点击上面的官网链接。
如果文章对你有帮助,请帮我点个赞吧~