MyBatis-Plus多数据源配置与读写分离全过程

 更新时间:2025年09月04日 14:13:16   作者:小刘|  
文章介绍了如何在SpringBoot中使用MyBatis-Plus实现多数据库操作,包括纯粹多库和读写分离的配置方法,重点演示了多数据源的设置与使用

一、引言

在实际的项目开发中,我们常常会遇到需要操作多个数据库的情况,比如纯粹多库、读写分离、一主多从、混合模式等。

本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景,并探讨读写分离的实现思路。

二、环境准备

  • 开发工具:IntelliJ IDEA
  • 数据库:MySQL
  • 框架:Spring Boot、MyBatis-Plus
  • 依赖管理:Maven

三、纯粹多库场景模拟

1. 创建数据库及表

首先,我们要创建两个数据库,分别是 mybatis_plus(原库保持不变)和 mybatis_plus_1(新建),并将 mybatis_plus 库的 product 表移到 mybatis_plus_1 库。

-- 创建数据库 mybatis_plus_1
CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `mybatis_plus_1`;

-- 创建 product 表
CREATE TABLE product
(
    id      BIGINT(20) NOT NULL COMMENT '主键 ID',
    name    VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称 ',
    price   INT(11) DEFAULT 0 COMMENT '价格 ',
    version INT(11) DEFAULT 0 COMMENT '乐观锁版本号 ',
    PRIMARY KEY (id)
);

-- 添加测试数据
INSERT INTO product (id, NAME, price) VALUES (1, '外星人笔记本 ', 100);

-- 删除 mybatis_plus 库中的 product 表
-- 请先连接到 mybatis_plus 数据库
USE mybatis_plus;
DROP TABLE IF EXISTS product;

2. 引入依赖

在 pom.xml 中添加 dynamic-datasource-spring-boot-starter 依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

3. 配置多数据源

在 application.yml 中配置多数据源:

spring:
  # 配置数据源信息
  datasource:
    dynamic:
      # 设置默认的数据源或者数据源组 ,默认值即为 master
      primary: master
      # 严格匹配数据源 ,默认 false.true 未匹配到指定数据源时抛异常 ,false 使用默认数据源
      strict: false
    datasource:
      master:
        url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
      slave_1:
        url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456

4. 创建用户 Service

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

// 指定所操作的数据源
@DS("master") 
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

5. 创建商品 Service

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@DS("slave_1")
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}

6. 测试

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class DynamicDataSourceTest {

    @Autowired
    private UserService userService;

    @Autowired
    private ProductService productService;

    @Test
    public void testDynamicDataSource() {
        System.out.println(userService.getById(1L));
        System.out.println(productService.getById(1L));
    }
}

如果测试时能顺利获取到用户对象和商品对象,那就表明多库模拟成功。

四、读写分离思路

如果要实现读写分离,可把写操作方法加上主库数据源,读操作方法加上从库数据源,这样就能自动切换。

示例代码:

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    // 写操作使用主库
    @DS("master")
    @Override
    public boolean save(User user) {
        return super.save(user);
    }

    // 读操作使用从库
    @DS("slave_1")
    @Override
    public User getById(Serializable id) {
        return super.getById(id);
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Idea工具中创建 SpringBoot工程及入门详解

    Idea工具中创建 SpringBoot工程及入门详解

    这篇文章主要介绍了Idea工具中创建 SpringBoot工程及入门分析详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 使用java实现百万级别数据导出excel的三种方式

    使用java实现百万级别数据导出excel的三种方式

    这篇文章主要介绍了使用java实现百万级别数据导出excel的三种方式,有些业务系统可能动辄涉及到百万上千万的数据,用正常的方法效率就变得很低,今天我们来看看这几种实现思路
    2023-03-03
  • MybatisPlus 连表查询、逻辑删除功能实现(多租户)

    MybatisPlus 连表查询、逻辑删除功能实现(多租户)

    这篇文章主要介绍了MybatisPlus 连表查询、逻辑删除功能实现(多租户),本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Java经典排序算法之归并排序详解

    Java经典排序算法之归并排序详解

    这篇文章主要为大家详细介绍了Java经典排序算法之归并排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java开发中的23种设计模式详解(推荐)

    Java开发中的23种设计模式详解(推荐)

    本篇文章主要介绍了Java开发中的23种设计模式详解,现在分享给大家,也给大家做个参考。感兴趣的小伙伴们可以参考一下。 设计模式(Design Patterns)
    2016-11-11
  • Java 远程调用失败重试的操作方法

    Java 远程调用失败重试的操作方法

    这篇文章主要介绍了Java 远程调用失败重试的操作方法,今天给大家介绍了一下 Spring​ 的 @Retryable 注解使用,并通过几个 demo 来带大家编写了自己重试拦截器以及回滚方法,需要的朋友可以参考下
    2022-09-09
  • Spring Boot常见外部配置文件方式详析

    Spring Boot常见外部配置文件方式详析

    这篇文章主要给大家介绍了关于Spring Boot常见外部配置文件方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • 详解JAVA 常量池

    详解JAVA 常量池

    这篇文章主要介绍了JAVA 常量池的相关资料,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java限流方法常见实现方案(单机限流和分布式限流)

    Java限流方法常见实现方案(单机限流和分布式限流)

    Java限流用于保护系统资源,分为单机(Guava/滑动窗口)和分布式(Redis+Lua)方案,核心算法包括固定窗口、令牌桶、漏桶等,推荐使用Sentinel等成熟框架实现动态流量控制,本文介绍Java限流方法常见实现方案(单机限流和分布式限流),感兴趣的朋友一起看看吧
    2025-08-08
  • Spring基于注解配置事务的属性

    Spring基于注解配置事务的属性

    这篇文章主要为大家详细介绍了Spring基于注解配置事务的属性,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论