注解说明
https://baomidou.com/reference/annotation/
多数据源
https://baomidou.com/guides/dynamic-datasource/
MyBatis-Plus 本身并不直接提供动态数据源插件,但你可以结合其他数据源路由插件(如 dynamic-datasource-spring-boot-starter)来实现动态数据源切换。AbstractRoutingDataSource 是 Spring 框架中提供的一个抽象类,用于实现动态数据源切换的功能。
以下是基于 AbstractRoutingDataSource 实现动态数据源切换的基本步骤:
添加依赖 首先,你需要在你的项目中添加 dynamic-datasource-spring-boot-starter 的依赖(如果你选择使用这个插件)。
配置数据源 在 application.yml 或 application.properties 文件中配置你的数据源,包括主数据源和从数据源。
创建自定义数据源 继承 AbstractRoutingDataSource 并实现其 determineCurrentLookupKey() 方法。这个方法用于确定当前线程应该使用哪个数据源。
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 根据业务需求或自定义的策略返回数据源标识
return DataSourceContextHolder.getDataSource();
}
}
其中 DataSourceContextHolder 是一个用于存储当前线程数据源标识的工具类。
创建 DataSourceContextHolder 这个类用于存储和获取当前线程的数据源标识。
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
public static String getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove();
}
}
配置数据源 Bean 在你的 Spring 配置类中,配置你的数据源 Bean,并将它们包装在你的自定义数据源中。
@Configuration
public class DataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dynamicDataSource")
public DataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource);
targetDataSources.put("slave", slaveDataSource);
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setDefaultTargetDataSource(masterDataSource);
dataSource.setTargetDataSources(targetDataSources);
return dataSource;
}
}
使用 AOP 或其他方式切换数据源 在你的业务代码中,你可以使用 AOP 来拦截需要切换数据源的方法,并在方法执行前设置当前线程的数据源标识。例如,你可以使用自定义注解来标识需要切换数据源的方法。
在 Mapper 或 Service 中使用 一旦你配置了动态数据源并实现了数据源切换的逻辑,你就可以在 Mapper 或 Service 中像平常一样编写代码,不需要显式地指定数据源。数据源的选择将由 DynamicDataSource 和 DataSourceContextHolder 自动处理。
请注意,上述步骤是一个基本的示例,你可能需要根据你的具体需求进行调整。此外,还有许多其他现成的动态数据源插件可供选择,你可以根据自己的需求选择合适的插件。