springboot+mybatis-plus配置多数据源(无废话)

  • Post author:
  • Post category:其他

1. 准备依赖

此处只展示了多数据源需要的依赖,基本的mybatisplus依赖不再展示

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
   <version>2.5.6</version>
</dependency>

2. 启动类注解加参数

此处易忽略,勿忘

@SpringBootApplication加参数exclude = {DruidDataSourceAutoConfigure.class}

// 第一行是需要加的,其他无必要不需要加(为方便理解才复制整个启动类)
@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class})
@MapperScan({"com.xingye.outerapi.**.mapper"})
@EnableSwagger2Doc
@EnableTransactionManagement
@EnableConvertScan(basePackages = "com.xingye.outerapi")
@EnableFeignClients
public class OuterapiApplication {
    public static void main(String[] args) {
        SpringApplication.run(OuterapiApplication.class,args);
    }
}

3. 配置文件配置多数据源

提醒一下,如果用yml的话一定注意空格缩进

spring:
  # 数据库配置
  datasource:
    # 此处的一般写默认库的信息
    url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test1?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: xxxxxxxxx
    password: xxxxxxxxxxx
    # 从这里开始是对多数据源的配置
    dynamic:
      primary: test1 # 设置默认的数据源或者数据源组,默认值即为test1
      strict: false # 严格匹配数据源,默认false(true未匹配到指定数据源时抛异常,false使用默认数据源)
      datasource:
        # 配置第1个数据库为test1
        test1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jjdbc:mysql://xxx.xxx.xxx.xxx:3306/test1?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
          driver-class-name: com.mysql.cj.jdbc.Driver
          username: xxxxxxxxx
          password: xxxxxxxxxxx
        # 配置第2个数据库为test2
        test2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test2?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
          driver-class-name: com.mysql.cj.jdbc.Driver
          username: xxxxxxxxx
          password: xxxxxxxxxxx

4. 在serviceImpl使用@DS

注解 结果
没有@DS 默认数据源
@DS(“dsName”) dsName可以为组名也可以为具体某个库的名称
  1. 在类上加,所有方法都会使用注解指定的数据源
@DS("test2")
@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private TestMapper testMapper;

    @Override
    public List<String> test1(String num) {
		........
    }

    @Override
    public List<String> test2(String num) {
		........
    }
}
  1. 在方法上加,各自方法使用各自注解指定的数据源

@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private TestMapper testMapper;
    
    @DS("test1")
    @Override
    public List<String> test1(String num) {
		........
    }
    
    @DS("test2")
    @Override
    public List<String> test2(String num) {
		........
    }
}

5. 注意事项

  • 不能使用事务,否则数据源不会切换,使用的还是第一次加载的数据源
  • 第一次加载数据源之后,第二次、第三次…操作其它数据源,如果数据源不存在,使用的还是第一次加载的数据源
  • 数据源名称不要包含下划线,否则不能切换

版权声明:本文为qq_41870860原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。