mybatisplus的多数据源

时间:2025-05-04 11:25:37

MyBatis-Plus 是 MyBatis 的增强工具,旨在简化开发者的操作。它提供了许多便捷的功能来减少样板代码的编写,并且在 MyBatis 的基础上进行了功能的扩展。当涉及到多数据源配置时,MyBatis-Plus 并没有提供特别的解决方案,而是依赖于 Spring 或者 Spring Boot 提供的多数据源支持。

下面是如何在 Spring Boot 项目中使用 MyBatis-Plus 实现多数据源配置的基本步骤:

引入依赖

确保你的 pom.xml 文件中包含了 MyBatis-Plus 和 Spring Boot 数据库相关的依赖项,例如:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

<!-- 如果你使用的是 MySQL -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

配置数据源

application.ymlapplication.properties 中为每个数据源定义属性。可以使用 Spring Boot 的 @ConfigurationProperties 注解来绑定这些属性到 Java Bean 上。

spring:
  datasource:
    master:
      url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    slave:
      url: jdbc:mysql://localhost:3306/slave_db?useSSL=false&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver

创建数据源 Bean

为每个数据源创建 DataSource Bean,并配置相应的 SqlSessionFactory 和 TransactionManager。

@Configuration
public class DataSourceConfig {

    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        return DataSourceBuilder.create().build();
    }

    // 其他配置...
}

动态数据源切换

为了能够在运行时动态切换数据源,你可以实现一个动态数据源路由(Dynamic DataSource Router),并在事务或请求级别上决定要使用的数据源。

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceType();
    }
}

public class DataSourceContextHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    public static void setDataSourceType(String dataSourceType) {
        contextHolder.set(dataSourceType);
    }

    public static String getDataSourceType() {
        return contextHolder.get();
    }

    public static void clearDataSourceType() {
        contextHolder.remove();
    }
}

然后你需要配置这个动态数据源作为主数据源:

@Bean(name = "dataSource")
public DataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                             @Qualifier("slaveDataSource") DataSource slaveDataSource) {
    DynamicDataSource dynamicDataSource = new DynamicDataSource();
    dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
    Map<Object, Object> dataSourceMap = new HashMap<>();
    dataSourceMap.put("master", masterDataSource);
    dataSourceMap.put("slave", slaveDataSource);
    dynamicDataSource.setTargetDataSources(dataSourceMap);
    return dynamicDataSource;
}

使用 AOP 或拦截器进行数据源选择

最后,可以通过 AOP 或者自定义注解的方式来选择不同的数据源。例如,可以在服务层的方法上添加注解来指定使用哪个数据源。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TargetDataSource {
    String name();
}

并使用 AOP 来拦截带有此注解的方法调用,在方法执行前设置数据源类型。