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: 123456
4. 创建用户 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); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。