MybatisPlus多数据源,详细配置及原理简单解析

发布时间 2023-09-22 11:50:16作者: 心愿路自平

MybatisPlus作为mybatis的增强工具,提供了配置多数据源的扩展,通过简单的3步配置,即可使用注解轻松切换数据源。

1.  引入坐标

<!--      dynamic-datasource多数据源坐标-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.6.1</version>
</dependency>

2. 配置数据源

spring:

  #mysql 数据源

  datasource:

    type: com.zaxxer.hikari.HikariDataSource

    dynamic:

      primary: master   # 默认主库名为master

      datasource:

        master:

          driver-class-name: com.mysql.cj.jdbc.Driver

          url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx

          username: xxxxxxx

          password: xxxxxxx

        secondary:

          driver-class-name: com.mysql.cj.jdbc.Driver

          url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx

          username: xxxxxxx

          password: xxxxxxx

        third:

          driver-class-name: com.mysql.cj.jdbc.Driver

          url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx

          username: xxxxxxx

          password: xxxxxxx

 

3. 在方法或者类上使用@DS切换数据源

a. DS注解既可以写在类上,也可以写在方法上,方法上的优先级高于类。

b. 如果没有指定DS的属性值或者没有使用DS注解,就自动走master主库。

通过以上3步,就可以轻松使用切换多数据源的能力了。当然,除了支持主从模式,还支持多主多从、多库,混合模式。

@Service
@DS("secondary")
public class  ServiceImpl implements Service {
    @Override
    public List List() {
        // TODO......
        return null;
    }
    @Override
    @DS("master")
    public List master() {
        // TODO......
        return null;
    }
    @Override
    @DS("secondary")
    public List secondary() {
        // TODO......
        return null;
    }
    @Override
    @DS("third")
    public List third() {
        // TODO......
        return null;
    }

原理探究

  1. 打开dynamic-datasource-spring-boot-starter.jar包,在spring.factories文件中,可以看到配置了DynamicDataSourceAutoConfiguration启动类。
  1. 打开DynamicDataSourceAutoConfiguration类,可以看到通过@AutoConfigureBefore注解,提前初始化了MP自己的DataSource数据源。
  1. DataSourceAutoConfiguration类的核心作用就是初始化DataSrouce,MP通过抢先配置的方式,使DataSource变成了自己指定的数据源。

除了初始化MP自己的数据源,DynamicDataSourceAutoConfiguration类还做了一些其他的初始化工作,比如DynamicDataSourceProperties配置,初始化DS注解的切面Advisor等。

初始化工作做完以后,接下来就是根据DS注解判断走哪个数据源了。

  1. DynamicDataSourceAnnotationInterceptor类是一个方法拦截器,它的invoke里面有判断DS key的操作。
  1. determineDatasourceKey方法中,会调用提前注入DataSourceClassResolver类的findKey方法,判断类或者方法上是否指定了DS注解。

.......