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

相关推荐
沐雪架构师3 小时前
mybatis连接PGSQL中对于json和jsonb的处理
json·mybatis
鹿屿二向箔4 小时前
基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统
spring·mvc·mybatis
aloha_78914 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
毕业设计制作和分享15 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
paopaokaka_luck18 小时前
基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)
java·spring boot·小程序·毕业设计·mybatis·1024程序员节
cooldream200918 小时前
Spring Boot中集成MyBatis操作数据库详细教程
java·数据库·spring boot·mybatis
不像程序员的程序媛19 小时前
mybatisgenerator生成mapper时报错
maven·mybatis
小布布的不1 天前
MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
前端·mybatis·springboot
背水1 天前
Mybatis基于注解的关系查询
mybatis
free_girl_fang1 天前
高效作业之Mybatis缓存
java·ide·缓存·mybatis