注解说明

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 自动处理。
请注意,上述步骤是一个基本的示例,你可能需要根据你的具体需求进行调整。此外,还有许多其他现成的动态数据源插件可供选择,你可以根据自己的需求选择合适的插件。

文档更新时间: 2024-05-26 13:51   作者:admin