springboot多数据源配置,看这一篇就够了

news2025/1/14 18:14:18

springboot下多数据源配置实现

不管是两个mysql,还是一个mysql一个oracle,都是一样的操作

目录

  • springboot下多数据源配置实现
    • 配置application.yml文件
    • 数据源配置类
    • 创建mapper接口
    • 创建mapper的xml配置文件
  • 你可能会遇到的问题

配置application.yml文件

application.properties也是一样的

spring:
  datasource:
    db1:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@//localhost:1521/orcl
      username: crm_user
      password: 123456
    db2:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@//localhost:1521/orcl
      username: root
      password: 123456

数据源配置类

  1. 创建一个config包,在这个包下创建db1的数据源配置类
@Configuration
@MapperScan(basePackages = "com.chenyx.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class UserDataSourceConfig {
    @Primary // 表示这个数据源是默认数据源,可以加也可以不加
    @Bean("db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db1")  // 读取application.yml中的配置参数映射成为一个对象
    public DataSource getUserDBDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean("db1SqlSessionFactory")
    public SqlSessionFactory userDBSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // mapper的xml配置文件位置
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));
        return bean.getObject();
    }
    
    @Primary
    @Bean("db1SqlSessionTemplate")
    public SqlSessionTemplate userDBSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

其中,basePackages是你在该数据源下的mapper接口文件存放的包名

  1. 同理,创建一个db2的数据源配置类
@Configuration
@MapperScan(basePackages = "com.chenyx.mapper.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class HrmDataSourceConfig {

    
    @Bean("db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db2")  // 读取application.yml中的配置参数映射成为一个对象
    public DataSource getUserDBDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean("db2SqlSessionFactory")
    public SqlSessionFactory hrmDBSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));
        return bean.getObject();
    }

    @Bean("db2SqlSessionTemplate")
    public SqlSessionTemplate hrmDBSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

创建mapper接口

根据前面的数据源配置类中的包名,需要创建一个mapper,再分别创建一个db1和db2的包,放对应的mapper接口

在这里插入图片描述

创建mapper的xml配置文件

在resources下创建一个mapper包,同样也是要与数据源配置类中的路径一致

在这里插入图片描述

你可能会遇到的问题

我们在创建数据表时,字段常常会带有下划线符号,而我们在类中对应的字段是用驼峰命名,如果不配置mybatis,那么查询出来的数据是没法找到对应字段的。

因此,在application.yml文件中加入如下配置

mybatis:
  configuration:
    mapUnderscoreToCamelCase: true

那么,到这里一般就结束了,但是我们配置两个数据源时手动配置了数据库连接,是读取不到这个配置的

解决办法:在数据源配置中增加配置,并在对应的SqlSessionFactory中进行设置

@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public org.apache.ibatis.session.Configuration globalConfiguration() {
    return new org.apache.ibatis.session.Configuration();
}

@Bean("db1SqlSessionFactory")
public SqlSessionFactory userDBSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    bean.setConfiguration(globalConfiguration());  // 将mybatis配置设置
    // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));
    return bean.getObject();
}

其中,@ConfigurationProperties(prefix = "mybatis.configuration")就是yml文件配置的前缀

到此,你应该可以成功地调用两个数据库的数据了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-Perl - study函数

描述 此功能需要花费额外的时间来研究EXPR,以改善在EXPR上执行的正则表达式的性能。如果省略EXPR,则使用$_。实际的速度增益可能非常小,具体取决于您希望搜索字符串的次数。 您一次只能学习一种表达式或标量。 语法 以下是此函数的简单语法- study EXPRstudy返回值 此函数…

Scala 如何调试隐式转换--隐式转换代码的显示展示

方法1 在需要隐式转换的地方,把需要的参数显示的写出。 略方法2,查看编译代码 在terminal中 利用 scalac -Xprint:typer xxx.scala方法打印添加了隐式值的代码示例。 对于复杂的工程来说,直接跑到terminal执行 scalac -Xprint:typer xxx.…

薅羊毛!我用这款AI工具,免费拿下12张漫画头像

今天l1m0_将为大家分享一款AI生图工具,并介绍如何通过Pixso AI,用自己的照片,免费一键生成AI漫画头像,一起来看看吧。 这里我用Pixso资源社区的一组用户头像资源,为大家演示,如何快速生成AI漫画头像。 首先…

小程序开发:如何选择合适的开发工具和平台?

小程序是一种基于微信平台的轻量级应用程序,具有操作简便、体验流畅等优点。然而,对于许多中小企业来说,三五万的开发成本可能过高,让人感到犹豫。 首先,三五万的成本包括了开发人员的费用、服务器费用、推广费用等。对…

JS大纲简介

1 HTML中的JavaScript js引用文件可以放在两个位置&#xff0c;一种是html中的head中&#xff0c;一种是html中的body中&#xff1b;放置在这两个位置&#xff0c;有何区别呢&#xff1f; 1.1 使用<script>元素的方式 1.1.1 放置在 head 中 引用example.js文件&#…

微信公众号扫码实现网站登录-Django+Vue版本-超详细保姆级教程

实现网页端微信扫码登录有三种方式&#xff1a; PlanA&#xff1a;微信开放平台 — 需认证 — 300元PlanB&#xff1a;微信公众号 — 需服务号且已认证 — 300元PlanC&#xff1a;微信小程序 — 需已上线备案的小程序 — 0元 本教程为Djangovue举例的微信公众号扫码登录&#…

.Net程序调试时接受外部命令行参数方式

1.对项目右键&#xff0c;属性 2.在调试中打开常规&#xff0c;打开调试启动配置文件UI 3.输入需要的命令行参数

Vue3 setup中使用$refs

在 Vue 3 中的 Composition API 中&#xff0c;$refs 并不直接可用于 setup 函数。这是因为 $refs 是 Vue 2 的实例属性&#xff0c;而在 Vue 3 中&#xff0c;setup 函数是与模板实例分离的&#xff0c;不再使用实例属性。 实际工作中确实有需求&#xff0c;在setup 函数使用…

Vue实现动态遍历生成el-input

实现效果: el-input的label是measureName, el-input绑定的值是formDatat.measureCode 接口返回的数据格式如下 处理过的formData的格式如下

Java开发工具哪个好,哪些常见

Java开发工具是很重要的存在&#xff0c;选择合适的Java开发工具对于开发人员来说非常重要。一个好的开发工具可以提高开发效率、简化开发流程并提供丰富的功能和工具支持。 以下是动力节点推荐的一些常用且受欢迎的Java开发工具&#xff1a; Eclipse&#xff1a;Eclipse是一款…

在 OpenCV 中使用深度学习进行年龄检测-附源码

文末附完整源码和模型文件下载链接 在本教程中,我们将了解使用 OpenCV 创建年龄预测器和性别分类器项目的整个过程。 年龄检测 我们的目标是创建一个程序,使用图像来预测人的性别和年龄。但预测年龄可能并不像你想象的那么简单,为什么呢?您可能会认为年龄预测是一个回归问…

【idea】社区版idea运行Tomcat

使用 Smart Tomcat插件 配置运行&#xff1a;

JavaScript常见语法--菜鸟教程

文章目录 JavaScript 语法<body> 中的 JavaScript JavaScript 输出使用 window.alert()操作 HTML 元素写到 HTML 文档写到控制台 JavaScript 语法JavaScript 字面量JavaScript 变量JavaScript 操作符JavaScript 语句JavaScript 字符集JavaScript判断类型 JavaScript数据类…

冉冉升起的星火,再度升级迎来2.0时代!

文章目录 前言权威性评测结果 星火大模型多模态功能插件功能简历生成文档问答PPT生成 代码能力 福利 前言 前几天从技术群里看到大家都在谈论《人工智能大模型体验报告2.0》里边的内容&#xff0c;抱着好奇和学习的态度把报告看了一遍。看完之后瞬间被里边提到的科大讯飞的星火…

基于ACF,AMDF算法的语音编码matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................... plotFlag …

系统驱动实现点灯

应用程序&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <string.h>int main(int argc, char const *argv[]) {/* code */…

小游戏扫雷实现教学(详解)

目录 【前言】 一、模块化程序设计&#xff08;多文件编程&#xff09;介绍 1.概述 2.传统编程的方式 3.模块化程序设计的方法 二、扫雷代码设计思路 三、扫雷代码设计 1.创建菜单函数 2.实现9x9扫雷 3.初始化棋盘 4.打印棋盘 5.随机布置雷的位置 6.排查雷的信息 7.回…

谈谈网络协议的定义、组成和重要性

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络协议的定义 二、网络协议的组成 1、…

java小技能:Stream流操作【foreach、filter、map、collect】(根据分类ID穿透查询文章、返回树结构菜单列表)

文章目录 引言I 根据分类ID穿透查询文章II Java小技能:多级菜单排序并返回树结构菜单列表引言 Stream可以由数组或集合创建,对流的操作分为两种: 中间操作,每次返回一个新的流,可以有多个。(筛选filter、映射map、排序sorted、去重组合skip—limit) 终端操作,每个流只…

idea 选中代码生成方法

idea 选中代码生成方法 非常好用 这边给大家送上显示GIF windows&#xff1a; 快捷键&#xff1a; CtrlAltM mac&#xff1a; commonAltM 转载至&#xff1a;https://blog.csdn.net/qq_38377190/article/details/80619632