MyBatis-Plus多数据源配置与读写分离全过程
作者:小刘|
文章介绍了如何在SpringBoot中使用MyBatis-Plus实现多数据库操作,包括纯粹多库和读写分离的配置方法,重点演示了多数据源的设置与使用
一、引言
在实际的项目开发中,我们常常会遇到需要操作多个数据库的情况,比如纯粹多库、读写分离、一主多从、混合模式等。
本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景,并探讨读写分离的实现思路。
二、环境准备
- 开发工具:IntelliJ IDEA
- 数据库:MySQL
- 框架:Spring Boot、MyBatis-Plus
- 依赖管理:Maven
三、纯粹多库场景模拟
1. 创建数据库及表
首先,我们要创建两个数据库,分别是 mybatis_plus(原库保持不变)和 mybatis_plus_1(新建),并将 mybatis_plus 库的 product 表移到 mybatis_plus_1 库。
-- 创建数据库 mybatis_plus_1
CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `mybatis_plus_1`;
-- 创建 product 表
CREATE TABLE product
(
id BIGINT(20) NOT NULL COMMENT '主键 ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称 ',
price INT(11) DEFAULT 0 COMMENT '价格 ',
version INT(11) DEFAULT 0 COMMENT '乐观锁版本号 ',
PRIMARY KEY (id)
);
-- 添加测试数据
INSERT INTO product (id, NAME, price) VALUES (1, '外星人笔记本 ', 100);
-- 删除 mybatis_plus 库中的 product 表
-- 请先连接到 mybatis_plus 数据库
USE mybatis_plus;
DROP TABLE IF EXISTS product;2. 引入依赖
在 pom.xml 中添加 dynamic-datasource-spring-boot-starter 依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>3. 配置多数据源
在 application.yml 中配置多数据源:
spring:
# 配置数据源信息
datasource:
dynamic:
# 设置默认的数据源或者数据源组 ,默认值即为 master
primary: master
# 严格匹配数据源 ,默认 false.true 未匹配到指定数据源时抛异常 ,false 使用默认数据源
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
slave_1:
url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 1234564. 创建用户 Service
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
// 指定所操作的数据源
@DS("master")
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}5. 创建商品 Service
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@DS("slave_1")
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}6. 测试
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class DynamicDataSourceTest {
@Autowired
private UserService userService;
@Autowired
private ProductService productService;
@Test
public void testDynamicDataSource() {
System.out.println(userService.getById(1L));
System.out.println(productService.getById(1L));
}
}如果测试时能顺利获取到用户对象和商品对象,那就表明多库模拟成功。
四、读写分离思路
如果要实现读写分离,可把写操作方法加上主库数据源,读操作方法加上从库数据源,这样就能自动切换。
示例代码:
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 写操作使用主库
@DS("master")
@Override
public boolean save(User user) {
return super.save(user);
}
// 读操作使用从库
@DS("slave_1")
@Override
public User getById(Serializable id) {
return super.getById(id);
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
