在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应用中灵活地切换多个数据源,满足复杂业务场景下的需求。务

相关推荐
沙白猿5 小时前
Redis报错:A bean with that name has already been defined in class path resource
spring boot·redis·mybatis
小马爱打代码7 小时前
MyBatis设计模式:构建者、工厂、代理模式
设计模式·mybatis·代理模式
柒.梧.1 天前
SSM常见核心面试问题深度解析
java·spring·面试·职场和发展·mybatis
rabbit_pro1 天前
Java使用Mybatis-Plus封装动态数据源工具类
java·python·mybatis
IT_Octopus1 天前
java 实体属性 Map 解决 mybatis-plus wrapper selectone 查mysql json类型为null 问题
java·mysql·mybatis
Dolphin_Home1 天前
MyBatis 核心属性详解笔记(由浅入深)
笔记·mybatis
一直都在5721 天前
MyBatis入门:CRUD、参数处理与防 SQL 注入
java·sql·mybatis
while(1){yan}2 天前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
memgLIFE2 天前
mybatis数据库查询
数据库·oracle·mybatis