前言
在复杂的业务场景中,我们可能需要从不同的数据库获取数据。MyBatis-Plus提供了一种便捷的方式来实现这一需求。本文将介绍如何在MyBatis-Plus中配置和使用多数据源。
引入必要的依赖
为了支持多数据源,我们首先需要引入MyBatis-Plus及相关依赖。以下是必要的依赖配置:
xml
<dependencies>
<!-- Spring Boot基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Spring Boot测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- MyBatis-Plus启动器依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- H2数据库依赖,用于测试 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 多数据源依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
</dependencies>
配置多数据源
在Spring的配置文件中,我们可以如下配置多个数据源,并指定默认数据源:
yaml
server:
port: 8088
spring:
datasource:
dynamic:
primary: plm # 默认数据源
strict: false # 未匹配到数据源时的行为
datasource:
plm:
url: jdbc:oracle:thin:@192.168.1.104:1521:agile9
username: PLM
password: tartan
driver-class-name: oracle.jdbc.driver.OracleDriver
swift:
url: jdbc:mysql://192.168.1.159:3306/lqzdb
username: root
password: mysql
driver-class-name: com.mysql.cj.jdbc.Driver
使用@DS
注解切换数据源
@DS
注解可以放在类或方法上,用于指定当前操作使用的数据源。如果同时在类和方法上使用,则方法上的注解优先级更高:
java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@DS("plm")
public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS("swift")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}
注意事务管理
问题描述
在处理多数据源时,如果涉及到事务管理,可能会遇到事务不一致的问题,尤其是当配置了不同类型的数据库(如MySQL和Oracle)时。
解决方案
- 移除事务管理,避免复杂的事务问题。
- 如果在服务层开启了事务,尝试将事务管理移至控制层,分别调用不同数据源的服务方法。
- 在调用不同数据源的方法时,可以通过
@Transactional(propagation = Propagation.REQUIRES_NEW)
注解重新开启新的事务或挂起当前事务。
结论
通过上述方法,可以在MyBatis-Plus应用中灵活地切换多个数据源,满足复杂业务场景下的需求。务