springboot2.6项目目前已经集成mybatis-plus,使用默认的数据库连接池,默认数据源为mysql,现在有个需求可以动态添加、修改、删除不同类型(oracle、MySQL、达梦、人大金仓等)的数据源,业务场景下,只对这些动态数据源做查询操作,应该如何处理
时间: 2024-02-04 17:04:20 浏览: 254
springboot+mybatis-plus动态数据源
对于动态数据源的需求,可以通过SpringBoot提供的动态数据源来实现。可以使用SpringBoot提供的AbstractRoutingDataSource类来实现动态数据源。
具体实现步骤如下:
1. 首先,需要定义一个动态数据源的配置类,该类继承AbstractRoutingDataSource。
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
```
其中,determineCurrentLookupKey()方法用于获取当前数据源的key值,DataSourceContextHolder是一个线程安全的类,用于设置和获取当前线程的数据源key。
2. 接着,需要定义一个数据源配置类,用于配置各个数据源的相关信息,如数据库url、用户名、密码等。
```java
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.oracle")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
// 其他数据源的配置
}
```
在上述代码中,使用@ConfigurationProperties注解来读取application.yml配置文件中的数据源配置信息,配置信息的前缀为spring.datasource。
3. 然后,在应用启动时,需要将各个数据源注入到一个Map中,Key为数据源类型,Value为数据源对象。
```java
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.oracle")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
// 其他数据源的配置
@Bean
public Map<String, DataSource> dataSourceMap() {
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("mysql", dataSource1());
dataSourceMap.put("oracle", dataSource2());
// 其他数据源的配置
return dataSourceMap;
}
}
```
4. 最后,需要在Controller或Service层中设置当前线程的数据源key,然后执行查询操作即可。
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUserList() {
DataSourceContextHolder.setDataSourceType("mysql");
return userMapper.getUserList();
}
public List<User> getUserListByOracle() {
DataSourceContextHolder.setDataSourceType("oracle");
return userMapper.getUserList();
}
// 其他查询方法
}
```
在上述代码中,使用DataSourceContextHolder设置当前线程的数据源key,然后调用对应的Mapper方法进行查询操作。
需要注意的是,这里只对动态数据源做查询操作,如果需要对动态数据源进行添加、修改、删除等操作,可以参考Mybatis-Plus官方文档中的动态数据源部分进行实现。
阅读全文