通过在配置文件中配置多个数据源,并且在 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: 132537

4 创建实体类

  • 新建一个 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

  • 新建接口 UserMapper

    public interface UserMapper extends BaseMapper<User> {}
  • 新建接口 ProductMapper

    public 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);
	}
 
}