首页 > 其他分享 >实战指南,SpringBoot + Mybatis 如何对接多数据源

实战指南,SpringBoot + Mybatis 如何对接多数据源

时间:2023-09-28 11:22:40浏览次数:29  
标签:jdbc return SpringBoot 数据源 Bean mysql Mybatis public

本文分享自华为云社区 《实战指南,SpringBoot + Mybatis 如何对接多数据源》,作者:战斧。

在我们开发一些具有综合功能的项目时,往往会碰到一种情况,需要同时连接多个数据库,这个时候就需要用到多数据源的设计。而Spring与Myabtis其实做了多数据源的适配,只需少许改动即可对接多数据源。本期我们就贴近实战,以一个单数据源的Demo为例,讲述将其改为多数据源项目的过程,希望大家能有所体会。

一、数据源的定义

 

数据源(Data Source)是指数据存储的地方,大多数情况是指数据库,不过文件服务器、传感器、API等也能算数据源,主要是提供了对数据的访问和操作。数据源中存储了所有建立数据库连接的信息。就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数据源名称,你可以找到相应的数据库连接。

 

二、单数据源配置

因为SpringBoot对数据源有着高度的默认配置,只配置一个数据源时,该数据源会被作为默认,所以对接单数据源其实是非常简单的。如果你的工程采用的yaml格式配置文件,我们仅需做如下配置:

spring:
  #数据库连接配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springtest
    username: root
    password: root

如果是采用properties配置文件的也是一样的:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springtest
spring.datasource.username=root
spring.datasource.password=root

三、如何配置多数据源

1. 工程层级调整

我们以曾经搭建的工程为原始模板,进行对接多数据源的操作。没看过的可以点此查看: 从零开始,手把手教你搭建Spring Boot后台工程并说明

因为仅变动数据源,所以我们不改动其他层级,仅仅将 mapper 拆为 mapper1 与 mapper2 两部分

2. Spring项目配置

然后我们需要在 application.properties 或者 application.yml 中定义多个数据源:

spring:
  #数据库连接配置
  datasource1:
    driver-class-name: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://127.0.0.1:3306/springtest2
    username: root
    password: root
  datasource2:
    driver-class-name: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://127.0.0.1:3306/springtest
    username: root
    password: root

这里有两个细节需要注意:

  • 因为我们决定使用双数据源,所以把数据源的连接配置改成了datasource1 和 datasource2。而不再保留datasource,这样SpringBoot就不再会为我们设定默认数据库
  • 因为我们目前采用的 springBoot2.5.2,默认的连接池为Hikari,该连接池数据源的地址字段为jdbc-url 而非 url。在只有单个数据源时,SpringBoot走默认数据源逻辑为我们把 url 与 jdbc-url 进行映射,保证我们获得数据源。此时我们自己设置的数据源没有进行映射处理,就需要保证字段符合Hikari的要求。否则会出现 java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName 异常

3. 会话配置

仅有配置文件可不行,接下来,我们需要在代码中读取到配置,并建立两个数据源。如下,每个数据源都有隔离的mapper接口、xml文件、会话工厂及会话模板

第一个数据源 如下(示例):

@Configuration
@MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSource1Config {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource1")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource1());
        String locationPattern = "classpath*:/mapper1/*.xml";
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));
        return sessionFactoryBean.getObject();
    }

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

配置第二个数据源 DataSource2Config

@Configuration
@MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class DataSource2Config {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource2")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory2() throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource2());
        String locationPattern = "classpath*:/mapper2/*.xml";
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));
        return sessionFactoryBean.getObject();
    }

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

    @Bean(name = "productMapper")
    public ProductMapper mapper2(@Qualifier("sqlSessionTemplate2") SqlSessionTemplate sqlSessionTemplate) throws Exception {
        return sqlSessionTemplate.getMapper(ProductMapper.class);
    }
}

4. 事务管理器

为两个数据源分别配置自己的事务管理器,如果你的项目里通篇没有方法级别的事务(一个SQL就是一个事务),那不设置这个也不影响,否则还是建议加上。

@Configuration
public class TransactionManagerConfig {

    @Autowired
    private DataSource dataSource1;

    @Autowired
    private DataSource dataSource2;

    @Bean
    public PlatformTransactionManager txManager1() {
        return new DataSourceTransactionManager(dataSource1);
    }

    @Bean
    public PlatformTransactionManager txManager2() {
        return new DataSourceTransactionManager(dataSource2);
    }
}

四、验证

我们把两张表拆进两个库中,以两个库模拟两个数据源,使得程序可以同时连接两个库

浏览器输入 http://127.0.0.1:8080/user/findall 查询接口成功

再在浏览器输入 http://127.0.0.1:8080/product/findall 查询第二个库的数据亦成功返回

这样我们就完成了一个工程同时连接两个数据源。

 

总结

经过上述的操作,我们已经成功把项目对接了多数据源。当然,方案肯定不止这一种,后续围绕该问题,我们还会讲解其他方式。但不论是什么方式,主旨都是加深大家对SpringBoot 和 Mybatis的理解,我们曾经梳理过全流程,但只是蜻蜓点水带大家看一遍大体轮廓,并不足以让你精通,后面本专栏将继续深入讲解。

点击关注,第一时间了解华为云新鲜技术~

 

标签:jdbc,return,SpringBoot,数据源,Bean,mysql,Mybatis,public
From: https://www.cnblogs.com/huaweiyun/p/17735275.html

相关文章

  • Mybatis中的设计模式
    最近在看《通用源码阅读指导书:Mybatis源码详解》,这本书一一介绍了Mybatis中的各个包的功能,同时也涉及讲了一些阅读源码的技巧,还讲了一些源码中涉及的设计模式,这是本篇文章介绍的内容在多说一点这本书,Mybatis是大部分Java开发者都熟悉的一个框架,通过这本书去学习如何阅读源码非常......
  • SpringBoot实现文件上传的多种方式
    我们平时在项目开发过程中,会遇到许多的文件上传与下载的需求,今天我们就来梳理一下文件上传的代码实现,基于SpringBoot快速搭建服务,集成文件上传功能,包括传统的文件上传方式,也拓展OSS对象存储方式。项目类型是Maven项目一、引入web依赖<dependency><groupId>org.springframework......
  • Web-入门-SpringBoot快速入门 创建springboot web项目
    web入门spring官网spring发展到今天已经形成了一种开发生态圈,spring提供了若干个子项目,为每个项目用于完成特定的功能。这些框架都是基于一个基础框架:直接基于SpringFramework基础框架进行开发会有两大难题:1.配置繁琐。2.入门难度大。所以spring家族意识到了这一点,......
  • 使用SpringBoot开发一个POST接口
    SpringBoot项目的分层SpringBoot框架项目一般分为五层:View层:向用户展示页面Controller层:前后端交互层,接收前端请求,调用Service层中的方法,接收Service层返回的数据并将其返回到前端。Service层:存放业务处理的逻辑,以及一些操作数据库的接口Mapper层:也可以成为DAO层,是数......
  • 在deepin上使用Fleet开发SpringBoot 3.0.0项目
    前言Fleet被称为是由JetBrains打造的下一代IDE,目前出于公测状态,可以免费下载使用。SpringBoot3.0.0最小支持是JDK17,这或许是对于JDK8的断舍离迈出的重大一步。出于对新工具和新技术的好奇,我开始尝试在deepin上用Fleet开发一个SpringBoot3.0.0项目,继续我的SpringBoot学习......
  • SpringBoot启动报错
    问题描述按照以往的代码进行SpringBoot的相应部署,但是爆出来这个错误:问题解决里面说找不到我定义的bean实体类,那就加上这么一条注解,让他能够找到实体类:然后启动:并在浏览器里面查看一下:ok!问题解决!......
  • springboot分层解耦
    软件开发需要符合“高内聚低耦合”的特性,所以需要将程序分为三层即: 使每一层各司其职,增加软件的复用性,使其更加便于维护,利于扩展。controller层:packagecom.wmx.controller;importcom.wmx.dao.EmpDao;importcom.wmx.dao.impl.EmpDaoA;importcom.wmx.pojo.Emp;impo......
  • SpringBoot学习4(02整合项目+前端)
    1.添加web界面在resources包下的static包中导入需要用的包,编写html。 1.1测试一下 页面控制台中成功获取数据 1.2页面显示:查询全部信息 1.3添加功能实现 新建按钮的点击事件为   @click="handleCreate()"点击新建后弹出添加页面,该页面的确定提交按钮点击事......
  • SpringBoot学习3(01整合案例项目数据层、业务层、表现层)
    1.整合第三方技术1.整合JUnittarget测试类和引导类为什么要有对应关系,如果没有相似的包结构导致出现的问题原因如下:基础篇-24-整合JUnit——classes属性_哔哩哔哩_bilibili2.整合MyBatis创建的时候选上mybatis和sql驱动 创建之后,进入setting修改信息,打开pom.xml修改信息,如......
  • 【详解】Spring Boot + Mybatis-Plus实现CRUD,轻松玩转接口操作!
    ......