天天看点

浅谈MyBatis-Plus的多数据源配置

作者:小亮叨叨叨

MyBatis-Plus是一个优秀的ORM框架,提供了方便的多数据源配置方法。

以下是配置方法:

1.在application.yml中添加多个数据源的配置信息。

spring:
  datasource:
    # 主数据源配置
    master:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db_master?useSSL=false
      username: root
      password: root
    # 从数据源配置
    slave:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db_slave?useSSL=false
      username: root
      password: root           

2.创建多个数据源的bean对象。

@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

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

3.配置数据源路由策略。

在这里,我们使用MyBatis-Plus提供的DynamicDataSource类来进行数据源路由。

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {

    @Autowired
    private DataSource masterDataSource;

    @Autowired
    private DataSource slaveDataSource;

    @Bean
    public DataSource dynamicDataSource() {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        Map<Object, Object> dataSourceMap = new HashMap<>();
        dataSourceMap.put(DataSourceType.MASTER.name(), masterDataSource);
        dataSourceMap.put(DataSourceType.SLAVE.name(), slaveDataSource);
        dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
        dynamicDataSource.setTargetDataSources(dataSourceMap);
        return dynamicDataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dynamicDataSource());
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml");
        sessionFactory.setMapperLocations(resources);
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setSqlInjector(new LogicSqlInjector());
        sessionFactory.setGlobalConfig(globalConfig);
        return sessionFactory.getObject();
    }
}
           

这里的DynamicDataSource类是:

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

public enum DataSourceType {
    MASTER, SLAVE;
}

public class DynamicDataSourceContextHolder {
    
    private static final ThreadLocal<DataSourceType> CONTEXT_HOLDER = new ThreadLocal<>();

    public static void setDataSourceType(DataSourceType dataSourceType) {
        CONTEXT_HOLDER.set(dataSourceType);
    }

    public static DataSourceType getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }

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

4.实现数据源切换。

对于需要访问从数据源的方法,只需要在调用前设置数据源类型,如下所示:

DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE);           

对于访问主数据源的方法,不需要设置数据源类型,默认为主数据源。

5.完成,现在可以在多个数据源之间进行快速切换。

继续阅读