MyBatis-Plus 多数据源配置指南
代码生成器配置
1. 引入依赖
首先需要在项目中添加 MyBatis-Plus 代码生成器和 FreeMarker 模板引擎的依赖:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency>
2. 快速生成代码
使用 MyBatis-Plus 的代码生成器可以快速生成实体类、Mapper、Service 和 Controller 等代码,极大提高开发效率。
多数据源配置
应用场景
MyBatis-Plus 支持多种多数据源场景:
纯粹多库
读写分离
一主多从
混合模式
示例场景:纯粹多库
我们创建两个数据库:
mybatis_plus
(已有库,保持不变)mybatis_plus_1
(新建库)
将 product
表从 mybatis_plus
移动到 mybatis_plus_1
,实现每个库一张表。
1. 创建数据库及表
-- 创建新数据库 CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; -- 使用新数据库 USE `mybatis_plus_1`; -- 创建商品表 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); -- 在原库中删除product表(如果存在) DROP TABLE IF EXISTS `mybatis_plus`.`product`;
2. 引入多数据源依赖
<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
@DS("master") // 指定操作的数据源 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { }
5. 创建商品Service
@DS("slave_1") // 指定操作的数据源 @Service public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService { }
6. 测试多数据源
@Autowired private UserService userService; @Autowired private ProductService productService; @Test public void testDynamicDataSource() { System.out.println(userService.getById(1L)); // 从master数据源查询 System.out.println(productService.getById(1L)); // 从slave_1数据源查询 }
测试结果
如果测试用例能够成功从两个不同的数据库获取数据,则多数据源配置成功。
读写分离实现思路
通过多数据源配置,我们可以轻松实现读写分离:
将写操作方法(如insert、update、delete)加上主库数据源注解
@DS("master")
将读操作方法(如select)加上从库数据源注解
@DS("slave")
通过AOP或手动指定方式实现数据源的自动切换
这种配置方式灵活且易于扩展,可以适应各种复杂的多数据源场景。