多数据源 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_db1 jdbc:mysql://121.40.20.185:3306 test root 123456
mysql_db2 jdbc:mysql://112.124.43.100:3306 test root 123456

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

sql 复制代码
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 构建

    在项目根目录下运行:

    bash 复制代码
    mvn clean install
  4. 启动项目

    运行 MainApplication.java 或使用命令行:

    bash 复制代码
    mvn spring-boot:run
  5. 测试接口

    使用 Postman 或 curl 命令测试接口。


使用说明

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

源码下载

多数据源 Demo

核心代码

demo/pom.xml

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

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();
    }
}
相关推荐
Pniubi2 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko73 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师3 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.3 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼4 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说5 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐7 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu7 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO7 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析