springboot3多数据源配置
springboot3+mybatisplus 实现多个数据源连接配置
前言
为了减少每天的重复工作,我前几天开发了一个项目,目的就是让代码去帮我完成那些重复工作,因为每天手动操作(包括查询数据、筛选数据、多次把这个数据库的数据导出,再导入到另一个数据库、然后查询、筛选等等),几个数据库导来导去,步骤又多又繁琐,又麻烦又浪费时间。
然后我把这个项目开发出来后,二十几步的操作,缩减成一步就行了。
要手动操作的一步就是启动项目,启动后,让程序自动运行,帮我处理那些事情,这速度可比我自己干快了不知道多少倍😂
然后开发这个工具,涉及到了三个数据库,这篇文章就记录一下springboot3如何配置连接多个数据库。
实现
一开始我找了一些文章看,按一些文章上的步骤来看的话,我以为配置多个数据库很麻烦,要写好几个配置文件,后面发现其实根本不用那么麻烦。
我这个项目是基于 jdk17 + springboot3 + mysql8
的。
pom.xml引入
<!-- springboot基本依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 多数据源需要用到的 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<!-- mybatis_plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- hutool工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
yml配置
yml配置这里,其它的倒没什么,正常配置即可,需要注意的就是数据库连接那一块
spring:
datasource:
dynamic:
primary: test1 #设置默认的数据源或者数据源组,默认值即为test1
datasource:
db1:
url: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
db2:
url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
db3:
url: jdbc:mysql://127.0.0.1:3306/test3?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
这几个数据库可以是本地的数据库,也可以是远程服务器的数据,自己配置 url、username、password 好即可。
操作不同数据库
yml配置好之后,我们就可以开始写service和mapper了,然后像我们操作不同数据库,则是通过 @DS("db3")
注解来实现。
@DS 注解的value,就是我们在yml配置的数据源名称:db1、db2、db3 。
然后这个注解可以注解在mapper层的方法上,也可以注解在service层的方法上,例如:
@Mapper
public interface LocalUserMapper extends BaseMapper<LocalUser> {
@DS("db1")
Long getMaxUserId(String key);
@DS("db1")
int updateMaxUserId(@Param("key") String key, @Param("userId") Long userId);
@DS("db2")
int insertBatch(List<LocalUser> list);
@DS("db3")
int deleteByName(List<String> list);
@DS("db2")
List<LocalUser> queryList(Map<String,Object> params);
}
@Slf4j
@Service
public class Test1UserService {
@Autowired
private SysUserMapper sysUserMapper;
@DS("db2")
public List<SysUser> selectList(Map<String,Object> param){
return sysUserMapper.selectList(param);
}
@DS("db2")
public void inserBatch(List<SysUser> list){
sysUserMapper.insertBatch(list);
}
}
@Slf4j
@Service
public class Test2UserService {
@Autowired
private SysUserMapper sysUserMapper;
@DS("db3")
public List<SysUser> selectList(Map<String,Object> param){
return sysUserMapper.selectList(param);
}
@DS("db3")
public void inserBatch(List<SysUser> list){
sysUserMapper.insertBatch(list);
}
}
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
List<SysUser> selectList(Map<String,Object> param);
int insertBatch(List<SysUser> list);
}
像如果mapper层的查询方法和sql语句,是不同数据库都会用到的,比如 SysUserMapper
中的 selectList
、insertBatch
方法,db2
和 db3
数据库都会用到,那我们就可以把 @DS
注解放到service
层的方法上,在service
层区分不同数据源,然后service层的方法正常调用就行。
最后
以上就是本篇文章的全部内容了,怎么样,配置、连接多个数据库是不是很简单。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)