mybatis-plus切换多数据源
时间: 2024-05-28 21:06:43 浏览: 176
Mybatis-Plus是一个基于Mybatis的增强工具,它为Mybatis提供了很多增强功能,其中之一就是支持多数据源的切换。下面介绍一下如何在Mybatis-Plus中切换多数据源:
1. 配置多数据源
在Spring Boot项目的配置文件application.yml中,可以配置多个数据源,例如:
```
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/master
username: root
password: root
slave:
url: jdbc:mysql://localhost:3306/slave
username: root
password: root
```
2. 创建多数据源配置类
创建一个多数据源的配置类,用于配置多个数据源,例如:
```
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
}
```
3. 创建动态数据源
在Mybatis-Plus中,需要使用动态数据源来实现多数据源的切换,可以创建一个DynamicDataSource类来实现。该类需要继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法,例如:
```
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
```
4. 创建数据源上下文
在切换数据源时,需要设置当前使用的数据源。可以使用ThreadLocal来保存当前使用的数据源,例如:
```
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String dataSourceKey) {
contextHolder.set(dataSourceKey);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
```
5. 配置SqlSessionFactory
在Spring Boot项目中,可以使用SqlSessionFactory来创建数据库连接和执行SQL语句。需要配置SqlSessionFactory来支持多数据源切换,例如:
```
@Configuration
public class MybatisConfig {
@Autowired
private DataSourceConfig dataSourceConfig;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dynamicDataSource());
sessionFactory.setTypeAliasesPackage("com.example.entity");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
return sessionFactory.getObject();
}
@Bean
public DynamicDataSource dynamicDataSource() {
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", dataSourceConfig.masterDataSource());
dataSourceMap.put("slave", dataSourceConfig.slaveDataSource());
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(dataSourceMap);
dynamicDataSource.setDefaultTargetDataSource(dataSourceConfig.masterDataSource());
return dynamicDataSource;
}
}
```
6. 切换数据源
在需要切换数据源的地方,可以调用DataSourceContextHolder.setDataSourceKey方法来设置当前使用的数据源的key。例如:
```
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> listUsers() {
DataSourceContextHolder.setDataSourceKey("slave");
List<User> userList = userMapper.selectList(null);
DataSourceContextHolder.clearDataSourceKey();
return userList;
}
}
```
阅读全文