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.完成,现在可以在多个数据源之间进行快速切换。