Github地址:https://github.com/apache/shardingsphere
官方文档:https://shardingsphere.apache.org/document/legacy/3.x/document/cn/overview/
官方文档写的太简单了,对于上手没有太多帮助;
初始化数据库
# 创建两个库create schema test0 collate utf8_general_ci;create schema test1 collate utf8_general_ci;# 创建7个测试用户表(第一个用于代码生成,不存储数据)create table test0.user(id bigint primary key,name varchar(20) not null,age int not null,email varchar(100) not null) comment '用户表';create table test0.user0(id bigint primary key,name varchar(20) not null,age int not null,email varchar(100) not null) comment '用户表';create table test0.user1(id bigint primary key,name varchar(20) not null,age int not null,email varchar(100) not null) comment '用户表';create table test0.user2(id bigint primary key,name varchar(20) not null,age int not null,email varchar(100) not null) comment '用户表';create table test1.user0(id bigint primary key,name varchar(20) not null,age int not null,email varchar(100) not null) comment '用户表';create table test1.user1(id bigint primary key,name varchar(20) not null,age int not null,email varchar(100) not null) comment '用户表';create table test1.user2(id bigint primary key,name varchar(20) not null,age int not null,email varchar(100) not null) comment '用户表';
# 初始化 ETH 区块表create table test0.t_eth_block(hash varchar(72) not null comment '哈希'primary key,number bigint not null comment '区块高度',miner varchar(72) not null default '' comment '矿工地址')comment 'ETH区块表';create table test0.t_eth_block0(hash varchar(72) not null comment '哈希'primary key,number bigint not null comment '区块高度',miner varchar(72) not null default '' comment '矿工地址')comment 'ETH区块表';create table test0.t_eth_block1(hash varchar(72) not null comment '哈希'primary key,number bigint not null comment '区块高度',miner varchar(72) not null default '' comment '矿工地址')comment 'ETH区块表';create table test0.t_eth_block2(hash varchar(72) not null comment '哈希'primary key,number bigint not null comment '区块高度',miner varchar(72) not null default '' comment '矿工地址')comment 'ETH区块表';
初始化 SpringBoot+Mybatis 项目
通过IDEA->New ->Project SpringBoot initializr 初始化项目,
或者 集成进现有 SpringBoot+Mybatis 项目。
集成 sharding-jdbc
通过官方的 starter 集成:
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency>
sharding-jdbc 配置
通过 yml 配置文件配置:
spring:
shardingsphere:
datasource:
names: test0,test1 # 数据源,这里为了方便直接使用库名的名称
test0:
type: com.alibaba.druid.pool.DruidDataSource # Druid连接池
url: jdbc:mysql://192.168.1.104:3306/test0 # 连接test0的url
username: root
password: pass
test1:
type: com.alibaba.druid.pool.DruidDataSource # Druid连接池
url: jdbc:mysql://192.168.1.104:3306/test1 # 连接test1的url
username: root
password: pass
sharding:
default-database-strategy: # 默认分库策略
inline:
sharding-column: age # 表示根据age列进行分库
algorithm-expression: test$->{age % 2} # 根据age对2的模进行分库,模为0表示test0库,模为1表示test1库
tables:
user:
actual-data-nodes: test$->{0..1}.user$->{0..2} # 表的名字,test$->{0..1}可以表示test0、test1两个库 user$->{0..2}表示user0、user1、user2三个库
table-strategy: # 分表策略
inline:
sharding-column: id # 根据哪一列进行分表,id表示根据列名为"id"的列分表
algorithm-expression: user$->{id%3} # 分表规则为id对3取模,id%3为0表示分到user0表 id%3为1表示分到user1表,id%3为2表示分到user2表
t_eth_block:
actual-data-nodes: test$->{0}.t_eth_block$->{0..2} # 不分库,只分表
table-strategy:
inline:
sharding-column: number
algorithm-expression: t_eth_block$->{ (number/5000000) as int}
# 分表规则为 number 对 5_000_000 取整,eg 一条数据 number=12_700_000 会被分到 t_eth_block2表
props:
sql:
show:
true # 打印sql
通过 mybatis-plus 生成代码
示例生成 EthBlock 相关代码:
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public class MyBatisPlusGenerator {
public static void main(String[] args) {
final AutoGenerator generator = new AutoGenerator();
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/test0");
dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("test123");
String projectPath = System.getProperty("user.dir");
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("t_eth_block");
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(projectPath + "/src/main/java");
globalConfig.setOpen(false);
globalConfig.setAuthor("Paradise");
PackageConfig packageConfig = new PackageConfig();
packageConfig.setModuleName("eth");
packageConfig.setParent("com.paradise.sharding");
packageConfig.setServiceImpl("service");
generator.setDataSource(dataSourceConfig);
generator.setStrategy(strategyConfig);
generator.setGlobalConfig(globalConfig);
generator.setPackageInfo(packageConfig);
generator.execute();
}
}
编写测试接口代码
package com.paradise.sharding.eth.controller;
import com.paradise.sharding.eth.entity.TEthBlock;
import com.paradise.sharding.eth.service.TEthBlockServiceImpl;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* ETH区块表 前端控制器
* </p>
*
* @author Paradise
* @since 2021-07-12
*/
@Api(tags = "block")
@RestController
@RequestMapping("/eth/block")
@AllArgsConstructor
public class TEthBlockController {
private final TEthBlockServiceImpl blockService;
@GetMapping
public List<TEthBlock> ethBlockList() {
return blockService.list();
}
@PutMapping
public boolean insert(@RequestBody TEthBlock block) {
blockService.save(block);
return true;
}
}
测试
录入最新的区块数据进行测试:

