springboot项目整合mybatisplus配置和使用多数据源的案例
时间: 2024-10-19 09:14:14 浏览: 48
Spring Boot项目整合MyBatisPlus并管理多个数据源的案例通常包括以下几个步骤:
1. **添加依赖**:
在pom.xml文件中添加对Spring Boot、Spring Data JPA、MyBatis Plus和对应的数据源库的依赖。例如,如果你有两个数据源,一个是MySQL,另一个是H2,你会有如下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot-starter</artifactId>
</dependency>
<!-- MySQL和H2 数据源 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope> <!-- 只在运行时加载 -->
</dependency>
```
2. **配置数据源**:
使用Spring Boot的`DataSourceProperties`或`@ConfigurationProperties`注解配置两个数据源,然后将它们添加到`DataSourceBean`中。每个数据源都需要有一个唯一的id以便于在代码中引用。
```java
@Configuration
public class DataSourceConfig {
@Value("${spring.datasource.master.url}")
private String masterUrl;
// 添加其他属性...
@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();
}
}
```
3. **MyBatisPlus全局配置**:
创建一个全局配置类,这里需要注入数据源,MyBatisPlus会根据环境自动选择正确的数据源。
```java
@Configuration
public class MybatisPlusConfig {
@Autowired
private DataSource masterDataSource;
@Autowired
private DataSource slaveDataSource;
@Profile("dev") // 开发环境选择master
@Bean
public GlobalConfig globalConfigDev() {
GlobalConfig config = new GlobalConfig();
config.setDataSource(masterDataSource);
// 其他配置...
return config;
}
@Profile("!dev") // 生产环境选择slave或其他环境
@Bean
public GlobalConfig globalConfigProd() {
GlobalConfig config = new GlobalConfig();
config.setDataSource(slaveDataSource);
// 其他配置...
return config;
}
}
```
4. **使用多数据源**:
在Repository接口上加上`@Mapper`注解,并根据业务场景选择特定的数据源。这通常是通过`@Select`或`@Insert`等注解前缀的`#{}`表达式来区分,例如`@MasterSelect`和`@SlaveSelect`。
```java
@Mapper
@MasterSelect // 当前操作使用主数据源
public interface UserMapper {
List<User> findAll();
}
@Mapper
@SlaveSelect // 当前操作使用从数据源
public interface AuditUserMapper {
List<AuditUser> findAuditUsers();
}
```
5. **事务管理**:
要处理跨数据源的操作,可能需要自定义事务管理器,比如使用AOP结合TransactionDefinition。
```java
@Aspect
@Transactional(rollbackFor = Exception.class)
public class MultiDataSourceTransactionAspect {
@Around("@annotation(multiDataSource)")
public Object doMultiDataSourceTransaction Around(ProceedingJoinPoint joinPoint, MultiDataSource multiDataSource) throws Throwable {
// 根据multiDataSource决定选择哪个数据源的事务
}
}
```
阅读全文