SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)
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文件中引入如下依赖
3.5.2 3.5.4 8.0.33 12.4.2.jre8 com.baomidou dynamic-datasource-spring-boot-starter ${dynamic-ds.version} com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} mysql mysql-connector-java ${mysql.version} com.microsoft.sqlserver mssql-jdbc ${sqlserver.version}
在common模块中引入对应的依赖项
com.baomidou dynamic-datasource-spring-boot-starter com.baomidou mybatis-plus-boot-starter
在需要执行数据库连接的服务加入mysql、sqlserver依赖驱动,例如在framework模块的pom文件加入
mysql mysql-connector-java com.microsoft.sqlserver mssql-jdbc
2.3 application.yml文件配置
application.yml
mybatis-plus: mapper-locations: classpath*:/mapper/*.xml global-config: db-config: id-type: assign_id banner: false
application-dev.yml
--- # 数据源配置 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.160:3306/mpw-dev?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.mapper") // 此处填写需要扫描的包路径
3 MyBatisPlus持久化文件自动引入
请参考文章快速自动化引入:Springboot快速生成Mapper、Xml、Pojo、Service的神器MyBatisX
4 多数据源使用
4.1 在controller层使用
在controller包下创建一个TestController控制器类,并引入以下代码
@RestController @RequestMapping("/test") @RequiredArgsConstructor public class TestController { private final TestService testService; @GetMapping("/hello") public String hello(){ System.out.println("Hello World!"); return "Hello World!"; } @GetMapping("/helloTest") public String helloTest(){ return testService.helloTest(); } /** * 获取主数据库(MySQL)中的指定数据 * * @return 返回指定ID为1的TestEntity对象的字符串表示形式 */ @GetMapping("/mysql_master") public String mysqlMaster(){ TestEntity testEntity = testService.getById(1); return testEntity.toString(); } /** * 从从数据库(MySQL)获取指定ID的数据 * * @DS("slave") 注解指定该方法使用从数据库进行操作 * @return 返回指定ID为1的TestEntity对象的字符串表示形式 */ @DS("slave") @GetMapping("/mysql_slave") public String mysqlSlave(){ TestEntity testEntity = testService.getById(1); return testEntity.toString(); } /** * 从SQL Server数据库获取指定ID的数据 * * @DS("sqlserver") 注解指定该方法使用SQL Server数据库进行操作 * @return 返回指定ID为1的TestEntity对象的字符串表示形式 */ @DS("sqlserver") @GetMapping("/sql_server") public String sqlServer(){ TestEntity testEntity = testService.getById(1); return testEntity.toString(); } }
查询mysql主库mysql_master结果
查询mysql从库mysql_slave结果
询sqlserver数据库sql_server结果
4.2 在service层使用
在TestService添加测试接口函数
public interface TestService extends IService { /** * 获取主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 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; /** * 从主数据库(MySQL)获取测试数据 * * @return 返回从主数据库(MySQL)获取的TestEntity对象的字符串表示形式 */ @GetMapping("/mysql_master_vo") public String mysqlMasterVo(){ TestEntity testEntity = testService.getTestMysqlMaseter(); System.out.println(testEntity.toString()); return testEntity.toString(); } /** * 从从数据库(MySQL)获取测试数据(使用VO) * * @return 返回从从数据库(MySQL)获取的TestEntity对象的字符串表示形式 */ @GetMapping("/mysql_slave_vo") public String mysqlSlaveVo(){ TestEntity testEntity = testService.getTestMysqlSalve(); System.out.println(testEntity.toString()); return testEntity.toString(); } /** * 从SQL Server数据库获取测试数据(使用VO) * * @return 返回从SQL Server数据库获取的TestEntity对象的字符串表示形式 */ @GetMapping("/sql_server_vo") public String sqlServerVo(){ TestEntity testEntity = testService.getTestSqlServer(); System.out.println(testEntity.toString()); return testEntity.toString(); } }
打开浏览器或者使用apifox等接口工具,发送对应的get请求,可以在控制台看到已经执行对应数据库的查询
5 示例测试工程(仅供参考)
应评论区小伙伴们要求,附上示例工程代码
5.1使用说明
下载资源压缩包解压完毕后会得到一个文件夹,在idea中打开
选中根目录
安全风险体系,选择信任打开
如果已经打开有idea项目工程,则选择新窗口打开工程
进入项目工程后,配置maven
设置成自己的maven仓库
在api模块的application-dev.yaml文件下,修改测试数据库为自己本地数据库
点击根目录pom文件,点击maven更新下载相关依赖包
点击maven的farework模块查看相关依赖项是否加载成功,如没加载去到对应模块包下点击更新maven依赖
点击maven安装依赖包
maven各模块依赖安装成功
点击运行程序应用
程序默认端口为8090
任意在浏览器输入http://localhost:8090/test/hello,显示项目启动成功
5.2 sqlserver 套接字安全报错
如果运行程序时,显示sqlserver安全套接字报错
com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
则需要解决驱动连接安全问题,比较见的办法是直接找到运行的jdk库,修改关闭安全协议
打开安装目录:E:\java-jdk\1.8.0_341\jre\lib\security,找到java.security用记事本打开编辑
注释掉源代码,然后删除画框部分复制一份新的执行,此项配置解决sqlserver在jdk8无法连接数据库的问题,连接报错如下
删除TLSV1,TLSV1.1后保存文件,重新启动项目工程即可。
总结:经过上述演示,我们已经实现了在springboot项目中实现多数据库源的连接和操作,如果需要使用不同数据库,按照上述操作思路即可实现。