MyBatis-Plus 是 MyBatis 的增强工具,旨在简化开发者的操作。它提供了许多便捷的功能来减少样板代码的编写,并且在 MyBatis 的基础上进行了功能的扩展。当涉及到多数据源配置时,MyBatis-Plus 并没有提供特别的解决方案,而是依赖于 Spring 或者 Spring Boot 提供的多数据源支持。
下面是如何在 Spring Boot 项目中使用 MyBatis-Plus 实现多数据源配置的基本步骤:
引入依赖
确保你的 pom.xml
文件中包含了 MyBatis-Plus 和 Spring Boot 数据库相关的依赖项,例如:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- 如果你使用的是 MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
配置数据源
在 application.yml
或 application.properties
中为每个数据源定义属性。可以使用 Spring Boot 的 @ConfigurationProperties
注解来绑定这些属性到 Java Bean 上。
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/slave_db?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
创建数据源 Bean
为每个数据源创建 DataSource Bean,并配置相应的 SqlSessionFactory 和 TransactionManager。
@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();
}
// 其他配置...
}
动态数据源切换
为了能够在运行时动态切换数据源,你可以实现一个动态数据源路由(Dynamic DataSource Router),并在事务或请求级别上决定要使用的数据源。
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
public static String getDataSourceType() {
return contextHolder.get();
}
public static void clearDataSourceType() {
contextHolder.remove();
}
}
然后你需要配置这个动态数据源作为主数据源:
@Bean(name = "dataSource")
public DataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", masterDataSource);
dataSourceMap.put("slave", slaveDataSource);
dynamicDataSource.setTargetDataSources(dataSourceMap);
return dynamicDataSource;
}
使用 AOP 或拦截器进行数据源选择
最后,可以通过 AOP 或者自定义注解的方式来选择不同的数据源。例如,可以在服务层的方法上添加注解来指定使用哪个数据源。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TargetDataSource {
String name();
}
并使用 AOP 来拦截带有此注解的方法调用,在方法执行前设置数据源类型。