Spring Boot 如何整合多个数据源?

Spring Boot整合多个MyBatis数据源实战教程 本文详细介绍了Spring Boot整合MyBatis实现多数据源的两种方案。静态多数据源适用于固定映射场景,通过独立配置DataSource、SqlSessionFactory和事务管理器实现;动态多数据源则支持运行时切换,需要使用动态数据源starter配置。文章包含完整的环境准备、数据库创建、配置代码示例和关键注解说明(如@Primary、@Qualifier),并提供了静态多数据源的核心实现步骤,包括数据源配置类和MyBatis配置类的编写方法,适合需要在项目中处理多个数据库连接的开发人员参考。 阅读详情

点击上方“程序IT圈”,选择“置顶公众号”

原创:一个程序员的成长  |  作者:冰峰

SpringBoot现在是很多很多公司应用的后端框架,因为它搭建快,能更好、更快速的整合其他第三方。那么随着业务的不断扩展,业务量的增加,这时候就会牵扯到分库分表,虽然这个词听起来很熟悉,作为程序员也很容易理解,但是我想应该也有不少读者没接触过分库分表,今天我们不聊如何分库分表,而是聊SpringBoot如何整合多个数据源的事情。也就是如何接入不同的(多个)数据库。

我们直接开始,我们直接创建一个干净的SpringBoot应用。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>


<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>


<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>

引入需要的maven坐标,那么我们这个工程就算搭建起来了,接下来就是配置,如何让SpringBoot整合两个Mysql数据源。首先我们在本地创建两个数据库test1和test2,同时在里面创建两个结构一样的表。

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(100) CHARACTER SET utf8 NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

在我们的工程中配置application.yml文件,将数据库的信息配置进去

spring:
  datasource:
    test1:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
      username: root
      password: 1234


    test2:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
      username: root
      password: 1234

接下来就是写我们的配置类了,这也是整合多个数据源最为关键的部分。

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;


import javax.sql.DataSource;


/**
 * @ClassName DataSource2Config
 * @Description TODO
 * @Auther lbt
 * @Date 2019/6/28/028 10:07
 * @Version 1.0
 */
@Configuration
@MapperScan(basePackages = "com.example.mapper.test1", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {




    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    @Primary
    public DataSource test1DataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "test1SqlSessionFactory")
    @Primary
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }


    @Bean(name = "test1TransactionManager")
    @Primary
    public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "test1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate test1SqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

第二个数据源的配置

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;


import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "com.example.mapper.test2", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSource2Config {




    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    public DataSource test2DataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }


    @Bean(name = "test2TransactionManager")
    public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "test2SqlSessionTemplate")
    public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

这样我们整个的配置其实就算好了,我们接下来写一个Controller类来测试一下,我们整合的数据源是不是真的可以用呢?

@RestController
public class TestController {


    @Autowired
    private User1Service user1Service;


    @Autowired
    private User2Service user2Service;


    @RequestMapping("/user1")
    public Object user1Controller() {


        List<UserPo> all = user1Service.findAll();


        return all;
    }


    @RequestMapping("/user2")
    public Object user2Controller() {


        List<UserPo> all = user2Service.findAll();


        return all;
    }
}

我写了个两个Controller方法,分别访问不同的接口,我们来看下访问结果。

当我们访问user1的时候返回如下:

当我们访问user2的时候访问如下

看到这里其实我们的整个整合也就完成了, 虽然看起来很简单,但是你如果没写过确实会走很多坑,我刚整合的时候就遇到了很多坑,为了帮助大家重复采坑,分享出来供大家参考,另外我已经上传GitHub,大家可以直接拉下来跑。

GitHub地址:

https://github.com/liangbintao/springboot_datasources.git

作者是一个转行过来的程序员,在学习的过程中碰了太多了的坑,走了很多弯路,我的很多读者也是刚转行过来的,也有很多学生,我把的学习过程中遇到的问题已经一些经验,分享在我的公众号,有思路有代码,做一个你肯定看的懂的公众平台。

~完~

打卡赠书:坚持30天打卡赠书新玩法!

送什么书?请点击左下角阅读原文查看!

签到方式:长按以下二维码参与打卡↓↓↓↓↓

欢迎转发,欢迎关注!


点个"在看",告诉我你曾来过

 

Spring Boot整合多数据源:多个MySQL和多个Oracle的前期准备 本文将详细介绍如何在Spring Boot应用程序中实现多个MySQL和多个Oracle数据源的整合。本文介绍了如何在Spring Boot应用程序中整合多个MySQL和多个Oracle数据源。希望本文对你有所帮助!你可以在需要使用数据源的地方注入相应的JdbcTemplate Bean,然后使用它进行数据库操作。整合多个Oracle数据源的步骤与整合多个MySQL数据源类似,只是需要使用Oracle数据库的驱动程序和相应的配置。接下来,我们将分别介绍如何整合多个MySQL和多个Oracle数据源。 阅读详情

相关推荐

ESP32-P4 GPIO双域架构:HP/LP分离、寄存器级控制与低功耗工程实践

GPIO(通用输入输出)是嵌入式系统中最基础且高频使用的硬件接口,其性能、灵活性与功耗特性直接影响产品实时性与续航能力。现代高性能MCU如ESP32-P4通过HP/LP双电源域分离、可编程IO复用(IO MUX)、信号交换矩阵及硬件自动化机制(如ETM事件、Sigma-Delta调制),将传统GPIO升级为兼具模拟能力、亚微秒响应与微安级待机的智能外设子系统。其核心价值在于实现引脚功能动态重构、中断零延迟处理、Deep-sleep期间自主唤醒与多核安全操作。典型应用场景涵盖工业PLC信号采集、电池供电传感器

weixin_35949153的博客 98

SpringBoot如何整合多个数据源,看这篇就够了

SpringBoot现在是很多很多公司应用的后端框架,因为它搭建快,能更好、更快速的整合其他第三方。那么随着业务的不断扩展,业务量的增加,这时候就会牵扯到分库分表,虽然这个词听起来很熟悉,作为程序员也很容易理解,但是我想应该也有不少读者没接触过分库分表,今天我们不聊如何分库分表,而是聊Spri...

chengkun4890的博客 2740

VASP实战:从非共线磁矩到自旋轨道耦合磁各向异性能的完整计算流程解析

本文详细解析了VASP中从非共线磁矩计算到自旋轨道耦合磁各向异性能的完整流程。通过实战案例和参数配置技巧,帮助研究者掌握非线性磁矩计算的关键步骤,包括SOC参数设置、文件传递逻辑以及磁各向异性能的精确提取方法,为材料磁性研究提供实用指导。

weixin_31102231的博客 409

springboot整合DataSource数据库连接池,HikariCP快速入门

spring boot整合DataSource数据源,HikariCP,构建springboot项目

qq_43807854的博客 1436

在x86机器上运行jailhouse

jailhouse jaihouse提供了一个demo ,https://github.com/siemens/jailhouse-images可以用于编译一整套可用的demo。 适用于多个平台。编译过程主要参考https://blog.youkuaiyun.com/weixin_39541632/article/details/110422345 此demo可以生成多个平台所用的操作系统image。 ...

闲人的专栏 3005

Android 13/14/15 默认授权应用权限的实现方法

Android版本修改方式实现原理13/14修改Permission.java将所有权限标记为Normal权限15修改DeviceIdleController.java + DefaultPermissionGrantPolicy.java监听应用安装并主动授权。

m0_60898338的博客 2911

springboot 多数据源_SpringBoot整合多数据源的巨坑一

导读本篇文章接上篇SpringBoot整合多数据源,你会了吗?,前面文章最后留了几个问题供大家思考,今天一一揭晓。配置如何优化上文整合的过程中的还顺带整合Mybatis和TransactionManager,为什么还要重新定义他们呢?SpringBoot不是给我们都配置好了吗?注意,此处优化就是这两个配置去掉,直接用SpringBoot的自动配置,顿时高级了,别人一看你的代码如此简单就实现了多数据...

weixin_39997664的博客 323

工业缺陷检测的新范式:2025-2026年零样本检测技术全景扫描

摘要: 工业视觉领域面临缺陷样本稀缺、标注成本高等痛点,零样本缺陷检测(Zero-Shot Defect Detection)成为研究热点。2025-2026年的技术进展主要分为三类:1)视觉-语言模型(VLM)路线,如CLIP适配器跨域对齐热成像数据;2)数字孪生路线,通过CAD模型生成理想状态对比检测缺陷;3)基于CLIP的提示学习,如Crane模型通过上下文提示提升泛化能力。尽管实验室效果显著(如IoU达70%),但在真实工业场景(如MIRAD数据集)中性能平均下降29.78%,凸显跨域泛化仍是挑战。

blanokvaffy的博客 1144

Spring Boot 项目中的三种多数据源方案,一个比一个强!

“ 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/dynamic-datasource/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 2. 实现方式 2.1 方案一 2.2 方案二 2.3 方案三 3. baomidou 多数据源 4. baomidou 读写分离 5. MyBatis 多数据源 6. Spring Data JPA 多数据源

tuantuanyua的博客 1万+

SAP ABAP 获取采购订单未清数量/在途库存的 6 种方式

这篇文章我总结了获取采购订单未清数量/在途库存的 6 种方式,每种方式的优劣势和适用场景有所不同。读者请结合自身需要选择。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 2665

ABAP 7.40 新语法介绍系列之二 - ABAP 类型转换操作符 CONV

这个lv_input_s变量的唯一使命,就是接收来自 char10 类型的 lv_input_c 变量的值,然后传递到 print 方法里去。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1419

Spring Boot 整合 JPA 使用多个数据源

介绍 JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的标准规范,Hibernate 是持久化规范的技术实现,而 Spring Data JPA 是在 Hibernate 基础上封装的一款框架。 第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。在这篇...

a495023351的博客 387

AD22里面封装修改后,同步到PCB图里面

【摘要】本文介绍了Altium Designer 22中同步更新元件封装的三种方法:1)从PCB库直接更新:在PCB库面板右键选择"Update PCB With[封装名]";2)通过原理图标准更新:使用Design->Update PCB Document菜单;3)在PCB编辑器中验证更新:通过Tools->Update From PCB Libraries菜单。所有方法最终都需通过ECO(工程变更订单)确认变更,建议执行前仔细核对变更内容。这些方法适用于AD22及早期版本

whm128的博客 1762

Spring Boot整合mybatis,多个数据源动态切换

Spring Boot整合mybatis,多个数据源动态切换导入依赖,配置依赖配置编写工具类列出所有的数据源key动态数据源保存一个线程安全的DatabaseType容器数据源注入对应的方法实例根据实体类自动创建数据库表配置实体类springboot集成mybatis的基本入口MyBatisMapperScannerConfig类 导入依赖,配置 依赖 <!-- mybatis --> <!-- https://mvnrepository.com/artifact/org.mybati

qq_36731585的博客 568

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdbc数据源是什么_Spring Boot 整合 JPA 使用多个数据源

介绍JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的标准规范,Hibernate 是持久化规范的技术实现,而 Spring Data JPA 是在 Hibernate 基础上封装的一款框架。 第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。在这篇文章中,我们...

weixin_39885067的博客 117

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring Boot 整合 JPA需要使用多个数据源,但配置和使用不正确。

在 Spring Boot 中整合多个数据源时,确保配置和使用的正确性是至关重要的。

Java开源程序猿 1415

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

boot jpa mysql postman spring_Spring Boot 整合 JPA 使用多个数据源

介绍JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的标准规范,Hibernate 是持久化规范的技术实现,而 Spring Data JPA 是在 Hibernate 基础上封装的一款框架。 第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。在这篇文章中,我们...

weixin_32820131的博客 114

spring boot 整合多数据源JDBC、多数据源mybatis、多数据源springdata jpa

目录 代码地址:(spring-boot github地址) 1、springboot整合JDBC 2、springboot整合mybatis 3、springboot整合springdata jpa 1、springboot整合jdbc 在application.properties中配置数据库链接信息 #数据源1 spring.datasource.one.typ...

境里婆娑 284

spring boot整合多数据源以及多数据源事务

引入jar包 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <v...

Zhang_1994_bf的博客 438

Spring Boot多数据源配置(一)durid、mysql、jpa整合

目前在做一个统计项目。需要多数据源整合,其中包括mysql和mongo。本节先讲mysql、durid、jpa与spring-boot的整合。 引入Durid包 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> &l...

144

spring boot 整合mybatis plus多数据源配置

spring boot 整合mybatis plus多数据源配置依赖数据源1功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

qq_39384387的博客 750
上一篇: 连 Git 命令都不会? 还做什么程序员
下一篇: 职场有一条高压线,不能随意透露薪资
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值