引言
在实际的项目开发中,我们经常会遇到需要切换多个数据源的情况。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.yml
或 application.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
本文来自极简博客,作者:云端漫步,转载请注明原文链接:MyBatis-Plus 注解切换多数据源