在MyBatis-Plus中实现多数据源切换

前言

在复杂的业务场景中,我们可能需要从不同的数据库获取数据。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)时。

解决方案

  1. 移除事务管理,避免复杂的事务问题。
  2. 如果在服务层开启了事务,尝试将事务管理移至控制层,分别调用不同数据源的服务方法。
  3. 在调用不同数据源的方法时,可以通过@Transactional(propagation = Propagation.REQUIRES_NEW)注解重新开启新的事务或挂起当前事务。

结论

通过上述方法,可以在MyBatis-Plus应用中灵活地切换多个数据源,满足复杂业务场景下的需求。务

相关推荐
爱学习的小王!24 分钟前
有关MyBatis的动态SQL
java·笔记·sql·学习·mybatis
m0_748248774 小时前
Spring Boot 集成MyBatis-Plus
spring boot·后端·mybatis
m0_748248025 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
williamyi7420 小时前
mybatis报错org/apache/commons/lang3/tuple/Pair] with root cause
apache·mybatis
bing_1581 天前
MyBatis Mapper 接口的作用,以及如何将 Mapper 接口与 SQL 映射文件关联起来
数据库·sql·mybatis
用户9634390241361 天前
Mybatis输出可执行的SQL
mybatis
就叫飞六吧2 天前
WangEditor快速实现版
node.js·mybatis
自在如风。2 天前
MyBatis-Plus 使用技巧
java·mybatis·mybatis-plus