推荐答案
在 MyBatis-Plus 中实现动态数据源切换可以通过以下步骤进行快速实现:
1. 添加依赖:在项目的构建文件(如 Maven 的 pom.xml)中添加 MyBatis-Plus 的依赖项。
com.baomidou
mybatis-plus-boot-starter
最新版本
2. 配置数据源:在项目的配置文件中配置多个数据源。可以使用不同的数据库连接信息来配置不同的数据源。
spring:
datasource:
dynamic:
primary: datasource1 # 指定默认的主数据源
datasource:
datasource1:
url: jdbc:mysql://localhost:3306/db1
username: root
password: password1
datasource2:
url: jdbc:mysql://localhost:3306/db2
username: root
password: password2
3. 创建数据源切换器:自定义一个数据源切换器,实现 `AbstractRoutingDataSource` 接口,并重写 `determineCurrentLookupKey` 方法,根据业务逻辑返回要使用的数据源的名称。
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 根据业务逻辑返回数据源的名称
return DataSourceContextHolder.getDataSource();
}
}
4. 创建数据源上下文持有器:创建一个数据源上下文持有器类,用于存储当前线程使用的数据源名称。可以使用 `ThreadLocal` 来实现线程级别的数据源切换。
public class DataSourceContextHolder {
private static final ThreadLocal contextHolder = new ThreadLocal<>();
public static void setDataSource(String dataSourceName) {
contextHolder.set(dataSourceName);
}
public static String getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove();
}
}
5. 配置数据源切换:在 Spring 的配置文件中配置数据源切换器和数据源上下文持有器。
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
return new DynamicDataSource();
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 配置其他 MyBatis 相关设置
return sessionFactory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
6. 使用注解切换数据源:在需要切换数据源的地方使用 `@DS` 注解指定要使用的数据源。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@DS("
datasource1") // 指定使用 datasource1 数据源
public List getUsers() {
return userMapper.selectList(null);
}
@Override
@DS("datasource2") // 指定使用 datasource2 数据源
public void addUser(User user) {
userMapper.insert(user);
}
}
下一篇java自动类型转换规则