MyBatis-Plus 注解切换多数据源

云端漫步 2024-07-24 ⋅ 30 阅读

引言

在实际的项目开发中,我们经常会遇到需要切换多个数据源的情况。MyBatis-Plus 是一个强大的 ORM 框架,提供了丰富的功能和灵活的配置选项。本文将介绍如何使用 MyBatis-Plus 注解来实现多数据源切换。

背景

在传统的单数据源项目中,我们只需要在配置文件中配置一个数据源,然后在代码中直接使用 MyBatis-Plus 的注解即可进行数据操作。但在多数据源的情况下,我们需要区分不同的数据源,并在不同的方法或类中使用不同的数据源。

步骤

以下是实现多数据源切换的步骤:

1. 添加依赖

首先,我们需要在项目的 pom.xml 文件中添加 MyBatis-Plus 的依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
</dependency>

2. 配置数据源

application.ymlapplication.properties 文件中配置多个数据源,例如:

spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/db_master
spring.datasource.druid.master.username=root
spring.datasource.druid.master.password=123456

spring.datasource.druid.slave.url=jdbc:mysql://localhost:3306/db_slave
spring.datasource.druid.slave.username=root
spring.datasource.druid.slave.password=123456

3. 创建数据源配置

创建一个数据源配置类,例如 DataSourceConfig.java,用于配置数据源和事务管理器:

@Configuration
@MapperScan(basePackages = "com.example.mapper")
public class DataSourceConfig {

    @Primary
    @Bean("masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.master")
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean("slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.slave")
    public DataSource slaveDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource,
                                               @Qualifier("slaveDataSource") DataSource slaveDataSource) throws Exception {
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        factoryBean.setDataSource(masterDataSource);

        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        factoryBean.setConfiguration(configuration);

        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath*:/mapper/*.xml"));

        // 添加多数据源
        Map<String, DataSource> dataSourceMap = new HashMap<>();
        dataSourceMap.put("master", masterDataSource);
        dataSourceMap.put("slave", slaveDataSource);
        MybatisRoutingDataSource routingDataSource = new MybatisRoutingDataSource();
        routingDataSource.setDefaultTargetDataSource(masterDataSource);
        routingDataSource.setTargetDataSources(dataSourceMap);
        factoryBean.setDataSource(routingDataSource);

        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean
    public PlatformTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource masterDataSource,
                                                         @Qualifier("slaveDataSource") DataSource slaveDataSource) {
        return new DataSourceTransactionManager(masterDataSource, slaveDataSource);
    }
}

4. 创建数据源切换注解

我们可以创建一个方法级别的注解 @DataSource,用于指定要使用的数据源。例如:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {
    String value() default "master";
}

5. 创建数据源切面

创建一个切面类,用于根据注解中指定的数据源进行切换。例如:

@Aspect
@Component
public class DataSourceAspect {

    @Around("@annotation(dataSource)")
    public Object proceed(ProceedingJoinPoint point, DataSource dataSource) throws Throwable {
        try {
            String dbName = dataSource.value();
            // 切换数据源
            DynamicDataSourceHolder.setDataSource(dbName);
            return point.proceed();
        } finally {
            // 恢复默认数据源
            DynamicDataSourceHolder.clearDataSource();
        }
    }
}

6. 使用注解切换数据源

在需要切换数据源的方法上使用 @DataSource 注解指定要使用的数据源。例如:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @DataSource("master")
    public User getMasterUser(long userId) {
        return userMapper.selectById(userId);
    }

    @DataSource("slave")
    public User getSlaveUser(long userId) {
        return userMapper.selectById(userId);
    }
}

结论

通过以上步骤,我们可以使用 MyBatis-Plus 注解来实现多数据源切换。使用注解可以灵活地指定要使用的数据源,实现了更细粒度的数据源切换。

如果你在使用 MyBatis-Plus 的过程中遇到问题,不妨尝试一下上述方法,相信能满足你的需求。

参考资料

[1] MyBatis-Plus Documentation: https://mybatis.plus/

[2] Spring Documentation: https://spring.io/docs

[3] Druid: https://github.com/alibaba/druid


全部评论: 0

    我有话说: