【第21章】MyBatis-Plus多数据源支持

文章目录

  • 前言
  • 一、dynamic-datasource
    • [1. 特性](#1. 特性)
    • [2. 约定](#2. 约定)
    • [3. 使用方法](#3. 使用方法)
      • [3.1 引入依赖](#3.1 引入依赖)
      • [3.2 配置数据源](#3.2 配置数据源)
      • [3.3 使用 @DS 切换数据源](#3.3 使用 @DS 切换数据源)
  • 二、mybatis-mate
    • 1.特性
    • 2.使用方法
      • [2.1 配置数据源](#2.1 配置数据源)
      • [2.2 使用 @Sharding 切换数据源](#2.2 使用 @Sharding 切换数据源)
      • [2.3 切换指定数据库节点](#2.3 切换指定数据库节点)
  • 三、实战
    • [1. 引入库](#1. 引入库)
    • [2. 配置](#2. 配置)
    • [3. 使用 @DS 切换数据源](#3. 使用 @DS 切换数据源)
    • [4. 测试类](#4. 测试类)
    • [5. 测试结果](#5. 测试结果)
  • 总结

前言

随着项目规模的扩大,单一数据源已无法满足复杂业务需求,多数据源(动态数据源)应运而生。本文将介绍两种 MyBatis-Plus 的多数据源扩展插件:开源生态的 dynamic-datasource 和 企业级生态的 mybatis-mate


一、dynamic-datasource

dynamic-datasource 是一个开源的 Spring Boot 多数据源启动器,提供了丰富的功能,包括数据源分组、敏感信息加密、独立初始化表结构等。

1. 特性

  • 数据源分组:适用于多种场景,如读写分离、一主多从等。
  • 敏感信息加密 :使用 ENC() 加密数据库配置信息。
  • 独立初始化:支持每个数据库独立初始化表结构和数据库。
  • 自定义注解 :支持自定义注解,需继承 DS
  • 简化集成 :提供对 DruidHikariCP 等连接池的快速集成。
  • 组件集成 :支持 Mybatis-PlusQuartz 等组件的集成方案。
  • 动态数据源:支持项目启动后动态增加或移除数据源。
  • 分布式事务 :提供基于 Seata 的分布式事务方案。

2. 约定

  • 本框架专注于数据源切换,不限制具体操作。
  • 配置文件中以下划线_ 分割的数据源首部为组名。
  • 切换数据源可以是组名或具体数据源名。
  • 默认数据源名为 master,可通过 spring.datasource.dynamic.primary 修改。
  • 方法上的注解优先于类上的注解。

3. 使用方法

3.1 引入依赖

xml 复制代码
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>${version}</version>
</dependency>

3.2 配置数据源

yml 复制代码
spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx)
          username: ENC(xxxxx)
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver

3.3 使用 @DS 切换数据源

java 复制代码
@Service
@DS("slave")
public class UserServiceImpl implements UserService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  @DS("slave_1")
  public List selectByCondition() {
    return jdbcTemplate.queryForList("select * from user where age >10");
  }
}

更多使用教程请参考Dynamic-Datasource 官网

二、mybatis-mate

mybatis-mate 是一个 MyBatis-Plus 的付费企业组件,内置很多好用的高级特性,其中包括多数据源扩展组件,提供了高效简单的多数据源支持。

1.特性

  • 注解 @Sharding:支持通过注解切换数据源。
  • 配置:支持灵活的数据源配置。
  • 动态加载卸载:支持动态加载和卸载数据源。
  • 多数据源事务:支持 JTA Atomikos 分布式事务。

2.使用方法

2.1 配置数据源

yml 复制代码
mybatis-mate:
  sharding:
    primary: mysql
    datasource:
      mysql:
        - key: node1
          ...
        - key: node2
          cluster: slave
          ...
      postgres:
        - key: node1
          ...

2.2 使用 @Sharding 切换数据源

java 复制代码
@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {

    @Sharding("postgres")
    Long selectByUsername(String username);

}

2.3 切换指定数据库节点

java 复制代码
// 切换到 mysql 从库 node2 节点
ShardingKey.change("mysqlnode2");

更多使用示例请参考

多数据源动态加载卸载:👉 mybatis-mate-sharding-dynamic

多数据源事务(jta atomikos):👉 mybatis-mate-sharding-jta-atomikos

三、实战

这里我们使用dynamic-datasource 来展示多数据源的使用

1. 引入库

xml 复制代码
<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot3-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
    <version>4.3.1</version>
</dependency>
<!-- 我本地starter没有把下面包关联进来,我手动引入了一遍 -->
<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring</artifactId>
    <version>4.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-creator -->
 <dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>dynamic-datasource-creator</artifactId>
     <version>4.3.1</version>
 </dependency>

看配置像是缺少了${project.version}这个变量,我已经向官方提交issue,期待回复吧~

2. 配置

yml 复制代码
spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/master
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3306/slave
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
       #以上会配置一个默认库master,一个组slave下有一个子库slave

3. 使用 @DS 切换数据源

java 复制代码
package org.example.springboot3.mybatisplus.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * Create by zjg on 2024/7/4
 */

@Service
@DS("master")
public class UserServiceImpl{

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List selectFromMaster() {
        return jdbcTemplate.queryForList("select * from user");
    }

    @DS("slave")
    public List selectFromSlave() {
        return jdbcTemplate.queryForList("select * from user");
    }
}

4. 测试类

java 复制代码
@SpringBootTest
public class SampleTest {

    @Autowired
    private UserServiceImpl userService;

    @Test
    public void dynamicDatasource() {
        List master = userService.selectFromMaster();
        List slave = userService.selectFromSlave();
        System.out.println(master);
        System.out.println(slave);
    }
}

5. 测试结果

bash 复制代码
[{id=1, name=master, age=18, email=master@qq.com, gender=0, status=active, create_time=2024-07-04 21:40:43.0, update_time=2024-07-04 21:40:46.0, deleted=0}]
[{id=1, name=slave, age=18, email=slave@qq.com, gender=0, status=active, create_time=2024-07-04 21:40:43.0, update_time=2024-07-04 21:40:46.0, deleted=0}]

sql语句已上传附件,欢迎下载使用


总结

回到顶部

通过上述介绍,我们可以看到 dynamic-datasourcemybatis-mate 都提供了强大的多数据源支持,开发者可以根据项目需求选择合适的插件来实现数据源的灵活管理。

相关推荐
潘多编程2 分钟前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_21 分钟前
SpringMVC
java·spring
代码在改了28 分钟前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot
权^34 分钟前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql
wclass-zhengge1 小时前
数据结构篇(绪论)
java·数据结构·算法
何事驚慌1 小时前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.1 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
TJKFYY1 小时前
Java.数据结构.HashSet
java·开发语言·数据结构
kylinxjd1 小时前
spring boot发送邮件
java·spring boot·后端·发送email邮件
OLDERHARD1 小时前
Java - MyBatis(上)
java·oracle·mybatis