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

相关推荐
星星不打輰12 小时前
SSM项目--SweetHouse 甜蜜蛋糕屋
java·spring·mybatis·ssm·springmvc
代码栈上的思考16 小时前
MyBatis:注解方式实现数据库 CRUD 全操作
java·开发语言·mybatis
꒰ঌ 安卓开发໒꒱19 小时前
一个参数引发的“插入成功却返回 -2147482646”:深入解析 MyBatis 批处理模式陷阱与高性能批量更新方案
mybatis
总会落叶1 天前
MyBatis XML映射配置与日志系统全解析
xml·tomcat·mybatis
2024暴富1 天前
SpringBoot基于Mybatis拦截器实现数据权限(图文)
spring boot·spring cloud·mybatis
Billow_lamb1 天前
MyBatis Plus 中常用的插件列表
java·mybatis
silence2501 天前
MyBatis-Plus 报错 Invalid bound statement(insert)?其实是 SqlSessionFactoryBean 踩坑了
mybatis·mybatis-plus
好学且牛逼的马2 天前
原生 JDBC + DbUtils + MyBatis 同场景 Demo(C3P0 数据源 XML 配置版)
xml·mybatis
代码栈上的思考2 天前
MyBatis XML的方式来实现
xml·java·mybatis
Jaising6662 天前
Mybatis Plus 主键生成器实现思路分析
数据库·spring boot·mybatis