当前位置: 首页 > ops >正文

多数据源 Demo

多数据源 Demo

项目简介

这是一个基于 Spring Boot + MyBatis Plus + Dynamic-Datasource 的多数据源项目 Demo。

该项目演示了如何在 Spring Boot 项目中配置多个 MySQL 数据源,并通过 @DS 注解实现不同数据源之间的切换,从而操作不同数据库中的相同结构表。


技术栈

  • Spring Boot 2.3.4.RELEASE
  • MyBatis Plus 3.5.2
  • Dynamic Datasource 4.2.0
  • MySQL 8.x
  • Lombok
  • Maven

数据库配置

本项目配置了两个数据源:

数据源名称地址数据库名用户名密码
mysql_db1jdbc:mysql://121.40.20.185:3306testroot123456
mysql_db2jdbc:mysql://112.124.43.100:3306testroot123456

两张数据库中都存在一个名为 user 的表,表结构如下:

CREATE TABLE `user` (`id` int NOT NULL,`username` varchar(20) NOT NULL,`password` varchar(20) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

项目结构

SpringBoot/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.boot/
│   │   │       ├── controller/ UserController.java
│   │   │       ├── service/ UserService.java
│   │   │       ├── service/impl/ UserServiceImpl1.java, UserServiceImpl2.java
│   │   │       ├── entity/ User.java
│   │   │       └── mapper/ UserMapper.java
│   │   └── resources/
│   │       ├── application.properties
│   │       └── pom.xml
│   └── test/
├── README.md
└── LICENSE

功能说明

本项目实现了两个数据源的切换,并为每个数据源分别提供了以下接口:

数据源 mysql_db1 接口

  • POST /user/login1
    用户登录(使用 mysql_db1 数据源)

  • POST /user/register1
    用户注册(使用 mysql_db1 数据源)

  • GET /user/list1
    获取所有用户列表(使用 mysql_db1 数据源)

数据源 mysql_db2 接口

  • POST /user/login2
    用户登录(使用 mysql_db2 数据源)

  • POST /user/register2
    用户注册(使用 mysql_db2 数据源)

  • GET /user/list2
    获取所有用户列表(使用 mysql_db2 数据源)


如何运行

  1. 数据库准备
    确保你已经启动了两个 MySQL 实例,并创建了 test 数据库以及 user 表。

  2. 配置数据库连接
    修改 application.properties 中的数据库连接信息(如果需要)。

  3. Maven 构建
    在项目根目录下运行:

    mvn clean install
    
  4. 启动项目
    运行 MainApplication.java 或使用命令行:

    mvn spring-boot:run
    
  5. 测试接口
    使用 Postman 或 curl 命令测试接口。


使用说明

  • 使用 @DS("数据源名称") 注解切换数据源。
  • 服务层分别注入了两个不同的实现类,分别对应不同的数据源。
  • 控制器中通过 @Resource(name = "bean名称") 区分注入的服务实现。

源码下载

多数据源 Demo

核心代码

demo/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><groupId>org.example</groupId><artifactId>SpringBoot</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.Release</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.2.0</version></dependency></dependencies>
</project>

demo/src/main/java/com/boot/controller/UserController.java

package com.boot.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.boot.entity.User;
import com.boot.service.UserService;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {@Resource(name = "userServiceImpl1")private UserService userServiceImpl1;@PostMapping("/login1")public String login1(@RequestParam String username, @RequestParam String password) {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getUsername, username);User user = userServiceImpl1.getOne(wrapper);if (user == null) {return "用户不存在";}if (!user.getPassword().equals(password)) {return "密码错误";}return "登录成功";}@PostMapping("/register1")public String register1(@RequestParam String username, @RequestParam String password) {User user = new User();user.setUsername(username);user.setPassword(password);boolean result = userServiceImpl1.save(user);return result ? "注册成功" : "注册失败";}@GetMapping("/list1")public List<User> list1() {return userServiceImpl1.list();}@Resource(name = "userServiceImpl2")private UserService userServiceImpl2;@PostMapping("/login2")public String login2(@RequestParam String username, @RequestParam String password) {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getUsername, username);User user = userServiceImpl2.getOne(wrapper);if (user == null) {return "用户不存在";}if (!user.getPassword().equals(password)) {return "密码错误";}return "登录成功";}@PostMapping("/register2")public String register2(@RequestParam String username, @RequestParam String password) {User user = new User();user.setUsername(username);user.setPassword(password);boolean result = userServiceImpl2.save(user);return result ? "注册成功" : "注册失败";}@GetMapping("/list2")public List<User> list2() {return userServiceImpl2.list();}
}
http://www.xdnf.cn/news/18083.html

相关文章:

  • python 数据拟合(线性拟合、多项式回归)
  • WPF 打印报告图片大小的自适应(含完整示例与详解)
  • quic协议与应用开发
  • 实战架构思考及实战问题:Docker+‌Jenkins 自动化部署
  • [Oracle数据库] Oracle 进阶应用
  • 基于 ONNX Runtime 的 YOLOv8 高性能 C++ 推理实现
  • 网络间的通用语言TCP/IP-网络中的通用规则2
  • CMakeLists.txt 学习笔记
  • Java中的128陷阱:深入解析Integer缓存机制及应对策略
  • 深度解析阿里巴巴国际站商品详情 API:从接口调用到数据结构化处理
  • 8.18决策树
  • Unity引擎播放HLS自适应码率流媒体视频
  • 代码随想录算法训练营四十五天|图论part03
  • 上网行为安全管理与组网方案
  • 在阿里云 CentOS Stream 9 64位 UEFI 版上离线安装 Docker Compose
  • 深入解析Kafka消费者重平衡机制与性能优化实践指南
  • Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
  • 【Goland】:Map
  • 【音视频】ISP能力
  • iOS 应用上架全流程实践,从开发内测到正式发布的多工具组合方案
  • Qt笔试题
  • HTML应用指南:利用POST请求获取全国华为旗舰店门店位置信息
  • 蓝桥杯算法之搜索章 - 6
  • Python入门第8课:模块与包的使用,如何导入标准库与第三方库
  • vite+react+antd,封装公共组件并发布npm包
  • lamp架构部署wordpress
  • 【新手易混】find 命令中 -perm 选项的知识点
  • Vue2篇——第六章 Vue 路由(VueRouter)全解析
  • 【AI论文】观察、聆听、记忆与推理:具备长期记忆能力的多模态智能体
  • 神经网络显存占用分析:从原理到优化的实战指南