多数据源 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
的表,表结构如下:
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 数据源)
如何运行
数据库准备
确保你已经启动了两个 MySQL 实例,并创建了test
数据库以及user
表。配置数据库连接
修改application.properties
中的数据库连接信息(如果需要)。Maven 构建
在项目根目录下运行:mvn clean install
启动项目
运行MainApplication.java
或使用命令行:mvn spring-boot:run
测试接口
使用 Postman 或 curl 命令测试接口。
使用说明
- 使用
@DS("数据源名称")
注解切换数据源。 - 服务层分别注入了两个不同的实现类,分别对应不同的数据源。
- 控制器中通过
@Resource(name = "bean名称")
区分注入的服务实现。
源码下载
核心代码
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();
}
}