SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)
在实际的项目开发中,我们往往需要同时连接多个数据源对数据进行处理。本文将详细介绍在SpringBoot下配合MybatisPlus如何连接多数据源,实例将会使用连接MySQL、SqlServer进行测试,可自行根据思路供自行连接Oracle、PostgreSQL等数据库。
1 创建需要的数据库和数据
1.1准备工作:
需要准备至少两台以上安装有mysql或sqlserver其他数据库的服务器,便于后续测试
例如:已经在服务器上安装好以下数据库
MySQL版本: 5.7.44
SqlServer版本: 2012
1.2 创建mysql测试库
例如在192.168.3.220服务器上创建jialiangkj-pet数据库,创建test表并添加测试数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`remark` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, '哈士奇', '这是一个正式库');
SET FOREIGN_KEY_CHECKS = 1;
在192.168.88.170服务器上创建jialiangkj-pet数据库,添加test表并添加测试数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`remark` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, '边牧', '这是一个测试库');
SET FOREIGN_KEY_CHECKS = 1;
1.3 创建sqlserver测试库
在本机的sqlserver数据库上创建test数据库,创建test表并添加测试数据
CREATE TABLE test.dbo.test (
id int NOT NULL,
name varchar(20) COLLATE Chinese_PRC_CI_AS NULL,
remark varchar(50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT test_pk PRIMARY KEY (id)
);
INSERT INTO test.dbo.test (name,remark,id) VALUES
(N'柯基',N'这是sqlserver数据库',1);
2 SpringBoot依赖引入
2.1 准备工作
首先需要一个已经创建好可用的SpringBoot项目工程,且已经安装MybatisX插件(自动化生成mapper、xml等文件)
单体架构工程创建请参考:Springboot创建Mave聚合工程(可灵活创建任意版本)
微服务工程创建请参考:SpringCloud微服务聚合工程创建指南
环境准备
- jdk1.8
- SpringBoot2.7.18
- MySQL5.7.44
- SqlServer2012
- JetBrains IDEA2023.3
- MyBatis-Plus 3.5.0
2.2 添加相关的pom文件依赖
在根目录的pom文件中引入如下依赖
<properties>
<dynamic-ds.version>3.5.2</dynamic-ds.version>
<mybatis-plus.version>3.5.4</mybatis-plus.version>
<mysql.version>8.0.33</mysql.version>
<sqlserver.version>12.4.2.jre8</sqlserver.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- dynamic-datasource 多数据源-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic-ds.version}</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- SqlServer -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${sqlserver.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
在common模块中引入对应的依赖项
<dependencies>
<!-- dynamic-datasource 多数据源-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependency>
在需要执行数据库连接的服务加入mysql、sqlserver依赖驱动,例如此处使用file文件服务做示例
<dependencies>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- SqlServer -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
</dependencies>
注意:以上依赖项为微服务架构引入示例,如果使用单体架构的项目根据需要直接一次性引入所有上述依赖效果一致
2.3 application.yml文件配置
mybatis-plus:
mapper-locations: classpath*:/mapper/*.xml
global-config:
db-config:
id-type: assign_id
banner: false
--- # 数据源配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错
strict: true
datasource:
# 主库数据源
master:
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
url: jdbc:mysql://192.168.3.220:3306/jialiangkj-pet?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: root
password: lvdamaoluguo
# 从库数据源
slave:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.88.170:3306/jialiangkj-pet-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: root
password: lvdamaoluguo
sqlserver:
type: ${spring.datasource.type}
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://localhost:1433;DatabaseName=test;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
username: sa
password: lvdamaoluguo
hikari:
# 最大连接池数量
maxPoolSize: 20
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间,默认10分钟
idleTimeout: 600000
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
maxLifetime: 1800000
# 多久检查一次连接的活性
keepaliveTime: 30000
2.4 添加mapper包扫描
在Application启动类,添加启动扫描mapper包
@MapperScan(basePackages = "cn.com.jialiangkj.file.mapper") // 此处填写需要扫描的包路径
3 MyBatisPlus持久化文件自动引入
请参考文章快速自动化引入:Springboot快速生成Mapper、Xml、Pojo、Service的神器MyBatisX
4 多数据源使用
4.1 在controller层使用
在controller包下创建一个TestController控制器类,并引入以下代码
@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class TestController {
private final TestService testService;
@GetMapping("/hello")
public String hello(){
return "Hello World!";
}
@GetMapping("/mysql_master")
public R mysqlMaster(){
TestEntity testEntity = testService.getById(1);
return R.ok(testEntity);
}
@DS("slave")
@GetMapping("/mysql_slave")
public R mysqlSlave(){
TestEntity testEntity = testService.getById(1);
return R.ok(testEntity);
}
@DS("sqlserver")
@GetMapping("/sql_server")
public R sqlServer(){
TestEntity testEntity = testService.getById(1);
return R.ok(testEntity);
}
}
注意:如果项目中没有已经封装好的返回数据对象R类,那么可以使用print对返回结果的类进行tostring打印即可,或者打断点进入调试模式查看查询返回结果。
查询mysql主库mysql_master结果
查询mysql从库mysql_slave结果
询sqlserver数据库sql_server结果
4.2 在service层使用
在TestService添加测试接口函数
public interface TestService extends IService<TestEntity> {
/**
* 获取主MySQL数据库中的TestEntity实体。
*
* @return 从主MySQL数据库中获取的TestEntity实例。
*/
public TestEntity getTestMysqlMaseter();
/**
* 获取从MySQL数据库中的TestEntity实体。
*
* @return 从MySQL从库中获取的TestEntity实例。
*/
public TestEntity getTestMysqlSalve();
/**
* 获取SQL Server数据库中的TestEntity实体。
*
* @return 从SQL Server数据库中检索到的TestEntity实例。
*/
public TestEntity getTestSqlServer();
}
在TestServiceImpl添加实现测试函数
@Service
@RequiredArgsConstructor
public class TestServiceImpl extends ServiceImpl<TestMapper, TestEntity>
implements TestService {
private final TestMapper testMapper;
@DS("master")
public TestEntity getTestMysqlMaseter() {
return testMapper.selectById(1);
}
@DS("slave")
public TestEntity getTestMysqlSalve() {
return testMapper.selectById(1);
}
@DS("sqlserver")
public TestEntity getTestSqlServer() {
return testMapper.selectById(1);
}
}
修改TestController控制器类代码,调用impl对应方法进行测试
@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class TestController {
private final TestService testService;
@GetMapping("/hello")
public String hello(){
return "Hello World!";
}
@GetMapping("/mysql_master")
public R mysqlMaster(){
TestEntity testEntity = testService.getTestMysqlMaseter();
System.out.println(testEntity.toString());
return R.ok();
}
@GetMapping("/mysql_slave")
public R mysqlSlave(){
TestEntity testEntity = testService.getTestMysqlSalve();
System.out.println(testEntity.toString());
return R.ok();
}
@GetMapping("/sql_server")
public R sqlServer(){
TestEntity testEntity = testService.getTestSqlServer();
System.out.println(testEntity.toString());
return R.ok();
}
}
打开浏览器或者使用apifox等接口工具,发送对应的get请求,可以在控制台看到已经执行对应数据库的查询
总结:经过上述演示,我们已经实现了在springboot项目中实现多数据库源的连接和操作,如果需要使用不同数据库,按照上述操作思路即可实现。