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

相关推荐
一勺菠萝丶2 小时前
Spring Boot + MyBatis/MyBatis Plus:XML中循环处理List参数的终极指南
xml·spring boot·mybatis
coding and coffee6 小时前
狂神说 - Mybatis 学习笔记 --下
java·后端·mybatis
耀耀_很无聊18 小时前
07_通过 Mybatis 自动填充记录的创建时间和更新时间
mybatis
程序员张319 小时前
SQL分析与打印-p6spy组件
spring boot·sql·mybatis·mybatisplus·p6spy
喜欢敲代码的程序员2 天前
SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:项目搭建(一)
spring boot·mysql·elementui·vue·mybatis
一只猿Hou2 天前
java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践
java·mybatis
java—大象12 天前
基于java SSM的房屋租赁系统设计和实现
java·开发语言·数据库·spring boot·layui·mybatis
Mutig_s12 天前
Spring Boot动态数据源切换:优雅实现多数据源管理
java·数据库·spring boot·后端·mybatis
编程乐学(Arfan开发工程师)12 天前
73、单元测试-断言机制
服务器·数据库·servlet·单元测试·sqlite·log4j·mybatis