下面是一份完整的SpringBoot整合ShardingJDBC实现分库分表最简单demo的攻略:
一、前置条件
- 掌握SpringBoot和Maven的基础及配置方式;
- 了解什么是ShardingJDBC以及其分库分表的实现原理;
- 准备好使用的数据库及其账号密码。
二、添加依赖
在Maven的pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>5.0.0-alpha</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>5.0.0-alpha</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>5.0.0-alpha</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
这些依赖用于引入ShardingJDBC及其SpringBoot集成包、MySQL驱动等。
三、配置ShardingJDBC
在SpringBoot的application.yml文件中添加以下配置:
spring:
datasource:
names: primary_ds, secondary_ds
primary_ds:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/primary_db?serverTimezone=UTC&useSSL=false
username: root
password: root
secondary_ds:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/secondary_db?serverTimezone=UTC&useSSL=false
username: root
password: root
shardingsphere:
datasource:
names: ds
ds:
primary_ds:
url: jdbc:mysql://localhost:3306/primary_ds?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: ***
secondary_ds:
url: jdbc:mysql://localhost:3306/secondary_ds?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: ***
sharding:
tables:
user:
actualDataNodes: ds.user_$->{0..1}
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: database_inline
databaseStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: database_inline
以上配置为ShardingJDBC的分库表策略,分为两个数据源(primary_ds和secondary_ds),两个库(primary_db和secondary_db)和一个分表(user_id),其中:
-
primary_db和secondary_db为两个逻辑库,对应两个数据源primary_ds和secondary_ds。
-
id字段为分表字段,数据会根据该字段进行取模选择表。
-
ds.user_$->{0..1}
表示user表共有2张表,分别为user_0和user_1。
四、编写Mapper
新建一个UserMapper接口,具体定义如下:
@Mapper
public interface UserMapper {
@Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})")
int insert(User user);
@Select("SELECT * FROM user")
List<User> selectAll();
}
以上Mapper为基于MyBatis的注解Mapper,用于定义数据访问API,这里仅定义了插入和查询全部记录两个方法,其中User类为具体业务实体模型,可根据需求自定义。
五、编写Service
新建一个UserService接口,具体定义如下:
public interface UserService {
int insert(User user);
List<User> selectAll();
}
新建一个UserServiceImpl类,具体定义如下:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public int insert(User user) {
return userMapper.insert(user);
}
@Override
public List<User> selectAll() {
return userMapper.selectAll();
}
}
以上为基于Spring的Service层,用于定义业务逻辑,这里应用了ShardingJDBC的分库分表功能,可实现数据自动分库分表。
六、编写Controller
新建一个UserController类,具体定义如下:
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/user")
public String createUser(@RequestBody User user) {
userService.insert(user);
return "create user success";
}
@GetMapping("/users")
public List<User> getUsers() {
return userService.selectAll();
}
}
以上为基于SpringMVC的Controller层,用于定义HTTP接口,其中POST /user接口用于创建用户,GET /users接口用于查询全部用户记录。
七、启动项目
启动SpringBoot应用,可以使用Postman等HTTP客户端进行测试,访问http://localhost:8080/users接口可以获取全部用户记录。
示例一
为了验证ShardingJDBC支持分库分表,可以新建一个名为testdb的数据库,在其中创建两个表user_0和user_1,再进行测试:
USE testdb;
CREATE TABLE user_0 (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64),
age INT
);
CREATE TABLE user_1 (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64),
age INT
);
启动SpringBoot应用,此时ReplicaQueryTests进程中将自动创建表user_0和user_1。然后使用Postman等工具进行测试,访问http://localhost:8080/user接口进行创建用户,观察数据库的数据是否插入到正确的表中。
示例二
为了验证ShardingJDBC支持分库分表,可以将两个表放到不同的数据库中,然后进行测试:
spring:
shardingsphere:
datasource:
names: ds
ds:
primary_ds:
url: jdbc:mysql://localhost:3307/primary_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: ***
secondary_ds:
url: jdbc:mysql://localhost:3308/secondary_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: ***
将primary_db放到本地的3307端口,secondary_db放到本地的3308端口。
启动SpringBoot应用,此时ReplicaQueryTests进程中将自动创建表user_0和user_1,并将数据分别插入到primary_db和secondary_db的user_0和user_1中,可以利用数据库客户端进行查询,观察数据是否插入到正确的库和表中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot整合shardingjdbc实现分库分表最简单demo - Python技术站