通过在配置文件中配置多个数据源,并且在 Service 类上使用 @DS 注解,标注要访问的数据源名称,就可以不同的数据访问不同的数据源了。
例如:
- 不同 Java 对象对应不同的 datasource
- 读写分离情况下,读写操作对应不同的 datasource
适用于多种场景:纯粹多库、读写分离、一主多从、混合模式等
1 创建数据库及表
mybatis_plus 数据库:含有 User 类对应的 user 表
mybatis_plus_1 数据库:含有 Product 类对应的 product 表
2 新建工程引入依赖
自行新建一个 Spring Boot 工程并选择 MySQL 驱动及 Lombok 依赖。
引入 MyBaits-Plus 的依赖及多数据源的依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>3 编写配置文件
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: 132537
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: 1325374 创建实体类
-
新建一个
User实体类(如果数据库表名有 t_前缀记得配置)@Data public class User { private Long id; private String name; private Integer age; private String email; } -
新建一个实体类
Product@Data public class Product { private Long id; private String name; private Integer price; private Integer version; }
5 创建 Mapper 及 Service
-
新建接口
UserMapperpublic interface UserMapper extends BaseMapper<User> {} -
新建接口
ProductMapperpublic interface ProductMapper extends BaseMapper<Product> {} -
新建 Service 接口
UserService指定操作的数据源@DS("master") //指定操作的数据源,master 为 user 表 public interface UserService extends IService<User> {} -
新建 Service 接口
ProductService指定操作的数据源@DS("slave_1") public interface ProductService extends IService<Product> {} -
自行建立 Service 的实现类
...
6 编写测试方法
记得在启动类中添加注解
@MapperScan()
class TestDatasourceApplicationTests {
@Resource
UserService userService;
@Resource
ProductService productService;
@Test
void contextLoads() {
User user = userService.getById(1L);
Product product = productService.getById(1L);
System.out.println("User = " + user);
System.out.println("Product = " + product);
}
}