前言

为了减少每天的重复工作,我前几天开发了一个项目,目的就是让代码去帮我完成那些重复工作,因为每天手动操作(包括查询数据、筛选数据、多次把这个数据库的数据导出,再导入到另一个数据库、然后查询、筛选等等),几个数据库导来导去,步骤又多又繁琐,又麻烦又浪费时间。

然后我把这个项目开发出来后,二十几步的操作,缩减成一步就行了。

要手动操作的一步就是启动项目,启动后,让程序自动运行,帮我处理那些事情,这速度可比我自己干快了不知道多少倍😂

然后开发这个工具,涉及到了三个数据库,这篇文章就记录一下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 中的 selectListinsertBatch 方法,db2db3 数据库都会用到,那我们就可以把 @DS 注解放到service层的方法上,在service层区分不同数据源,然后service层的方法正常调用就行。

最后

以上就是本篇文章的全部内容了,怎么样,配置、连接多个数据库是不是很简单。

Logo

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

更多推荐