SpringBoot3.4.0结合Mybatis-plus实现动态数据源
SpringBoot3.4.0结合Mybatis-plus实现动态数据源

上一篇文章01SpringBoot3专栏-SpringBoot3.4.0整合Mybatis-plus和Mybatis我们整合了SpringBoot3.4和Mybatis-plus框架,今天我们来应用SpringBoot和Mybatis-plus的动态数据源功能。随着项目规模的扩大,单一数据源已无法满足复杂业务需求,动态数据源应运而生
完整代码在文章最后,如果觉得本篇文章对你有用,记得点赞、关注、收藏哦。你的支持是我持续更新的动力!
SpringBoot3专栏软件环境
- JDK17.0.12
- SpringBoot3.4.0
- mybatis-plus-spring-boot3-starter3.5.9
- IDEA2024.2.0.2
我们先看本篇文章对应的项目结构,请看下图

1 动态数据源项目搭建
1.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.itbeien</groupId>
<artifactId>springboot3-labs-master</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>dynamic-datasource-mybatis-plus</artifactId>
<properties>
<dynamic-datasource-spring-boot3-starter-version>4.3.1</dynamic-datasource-spring-boot3-starter-version>
</properties>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>${dynamic-datasource-spring-boot3-starter-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 配置信息
# 一主多从
server.port=9999
spring.datasource.dynamic.primary=master
spring.datasource.dynamic.strict=false
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.0.104:3306/dynamic01?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=rootpwd20240809
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://192.168.0.104:3306/dynamic02?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.dynamic.datasource.slave_1.username=root
spring.datasource.dynamic.datasource.slave_1.password=rootpwd20240809
spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave_2.url=jdbc:mysql://192.168.0.104:3306/dynamic03?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.dynamic.datasource.slave_2.username=root
spring.datasource.dynamic.datasource.slave_2.password=rootpwd20240809
spring.datasource.dynamic.datasource.slave_2.driver-class-name=com.mysql.jdbc.Driver
2 代码实现及测试
2.1 dao层和实体类
package cn.itbeien.dynamic.mapper;
import cn.itbeien.dynamic.entity.SysUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface SysUserMapper extends BaseMapper<SysUser> {
}
package cn.itbeien.dynamic.entity;
import lombok.Data;
@Data
public class SysUser {
private Long id;
private String name;
private Integer age;
private String email;
}
2.2 Service 层中实现动态数据源
package cn.itbeien.dynamic.service;
import cn.itbeien.dynamic.mapper.SysUserMapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author itbeien
* 项目网站:https://www.itbeien.cn
* 公众号:贝恩聊架构
* 全网同名,欢迎小伙伴们关注
* 没有@DS 默认数据源
* @DS("dsName") dsName可以为组名也可以为具体某个库的名称
* Copyright© 2024 itbeien
*/
@Service
public class UserServiceImpl implements UserService{
@Resource
private SysUserMapper sysUserMapper;
/**
* 没有添加多数据源注解,默认访问主库
*/
@Override
public List selectAll() {
return sysUserMapper.selectList(null);
}
/**
* 添加多数据源注解,访问第一个从库
*/
@DS("slave_1")
@Override
public List selectAllSlave01() {
return sysUserMapper.selectList(null);
}
/**
* 添加多数据源注解,访问第二个从库
*/
@DS("slave_2")
@Override
public List selectAllSlave02() {
return sysUserMapper.selectList(null);
}
}
2.3 单元测试代码
package cn.itbeien.dynamic;
import cn.itbeien.dynamic.entity.SysUser;
import cn.itbeien.dynamic.mapper.SysUserMapper;
import cn.itbeien.dynamic.service.UserService;
import com.baomidou.dynamic.datasource.annotation.DS;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
/**
* @author itbeien
* 项目网站:https://www.itbeien.cn
* 公众号:贝恩聊架构
* 全网同名,欢迎小伙伴们关注
* 没有@DS 默认数据源
* @DS("dsName") dsName可以为组名也可以为具体某个库的名称
* Copyright© 2024 itbeien
*/
@SpringBootTest
public class DynamicTest {
@Autowired
private UserService userServiceImpl;
/**
* 查询master库 dynamic01
*/
@Test
public void testMasterSelect() {
System.out.println(("----- selectAll method test ------"));
List<SysUser> userList = userServiceImpl.selectAll();
Assertions.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
/**
* 查询slave_1库 dynamic02
*/
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<SysUser> userList = userServiceImpl.selectAllSlave01();
Assertions.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
/**
* 查询slave_2库 dynamic03
*/
@Test
public void test02Select() {
System.out.println(("----- selectAll method test ------"));
List<SysUser> userList = userServiceImpl.selectAllSlave02();
Assertions.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
}
2.4 单元测试结果



欢迎大家关注我的项目实战内容itbeien.cn,一起学习一起进步,在项目和业务中理解各种技术。

欢迎沟通交流技术和支付业务,一起探讨聚合支付/预付卡系统业务、技术、系统架构、微服务、容器化。并结合聚合支付系统深入技术框架/微服务原理及分布式事务原理。加入我的知识星球吧

SpringBoot3专栏
01SpringBoot3专栏-SpringBoot3.4.0整合Mybatis-plus和Mybatis
跟着我学微服务系列
01跟着我学微服务,什么是微服务?微服务有哪些主流解决方案?
05SpringCloudAlibaba之图文搞懂微服务核心组件在企业级支付系统中的应用
06JDK17+SpringBoot3.4.0+Netty4.1.115搭建企业级支付系统POS网关
07JDK17+SpringCloud2023.0.3搭建企业级支付系统-预付卡支付交易微服务
08JDK17+Dubbo3.3.2搭建企业级支付系统-预付卡支付交易微服务
09JDK17+SpringBoot3.3.6+Netty4.1.115实现企业级支付系统POS网关签到功能
贝恩聊架构-项目实战地址
3 源码地址
贝恩聊架构-SpringBoot3专栏系列文章、资料和源代码会同步到以下地址,代码和资料每周都会同步更新
该仓库地址主要用于贝恩聊架构-SpringBoot3专栏、基于企业级支付系统,学习微服务整体技术栈
