springboot配置多个数据源

实际业务中;在一个项目里面读取多个数据库的数据来进行展示,例如读取mysql,pgsql,oracle的不同数据库,springboto对同时配置多个数据源是支持的。

使用springboot+mybatis的框架来进行演示,

在配置文件中配置多个数据源,然后通过配置类来获取数据源以及mapper相关的扫描配置

pom.xml文件

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>...</version><relativePath/></parent><dependencies><!-- druid数据源驱动 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis SpringBoot依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- aop依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><!-- 通用mapper --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>1.1.5</version></dependency><!-- druid监控依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.28</version></dependency></dependencies>

application.yml 配置文件中可以配置多个不同数据源,例如下面配置了mysql和pgsql两个不同数据源。

spring:datasource:mysql-op:   //数据源1,mysqltype: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456schema: tasa_devpgsql-npaaa: //数据源2,pgsqltype: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.pgsql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8username2: rootpassword2: 123456schema: tasa_test

如果使用type类型 com.alibaba.druid.pool.DruidDataSource,需要进行DruidDBConfig 连接池相关配置,如下所示,如果时候type是其他类型,例如spring.datasource.type=com.zaxxer.hikari.HikariDataSource,就可以不配置下面的内容。

package com.xbz.common.config;import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Druid监控*/
@SuppressWarnings("AlibabaRemoveCommentedCode")
@Configuration
public class DruidDBConfig {private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);/*** 注册ServletRegistrationBean* @return*/@Beanpublic ServletRegistrationBean druidServlet() {ServletRegistrationBean reg = new ServletRegistrationBean();reg.setServlet(new StatViewServlet());reg.addUrlMappings("/druid/*");reg.addInitParameter("allow", ""); //白名单return reg;}/*** 注册FilterRegistrationBean* @return*/@Beanpublic FilterRegistrationBean filterRegistrationBean() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new WebStatFilter());filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");filterRegistrationBean.addInitParameter("profileEnable", "true");filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");filterRegistrationBean.addInitParameter("DruidWebStatFilter", "/*");return filterRegistrationBean;}
}

配置数据源mysql-op的连接信息,包含配置数据库连接信息,扫描对应的实体类路径。

package com.xbz.common.config;import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
import java.sql.SQLException;@Configuration
@MapperScan(basePackages  = {"com.biz.data.process.mapper.op", //配置数据源需要读取的mapper文件路径,也就是需要在这个数据源下执行的sql"com.biz.data.process.mapper.npa","com.biz.data.process.mapper.cust"} , sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDbConfig {private Logger logger = LoggerFactory.getLogger(MysqlDbConfig.class);private static final String MAPPER_LOCATION = "classpath*:mapper/master/*.xml";private static final String DOMAIN_PACKAGE = "com.xbz.**.domain";//从配置文件中读取数据库连接信息@Value("${spring.datasource.url}")private String dbUrl;//从配置文件中读取数据库连接信息@Value("${spring.datasource.username}")private String username;//从配置文件中读取数据库连接信息@Value("${spring.datasource.password}")private String password;//从配置文件中读取数据库连接信息@Value("${spring.datasource.driverClassName}")private String driverClassName;//从配置文件中读取数据库连接信息@Value("${spring.datasource.schema}")private String schema;@AutowiredMybatisPlusInterceptor mybatisPlusInterceptor; //分页插件注入@Bean(name="masterDataSource")   //声明其为Bean实例@Primary  //在同样的DataSource中,首先使用被标注的DataSourcepublic DataSource MysqlDbConfig () {DruidDataSource datasource = new DruidDataSource();//不适用Druid时,使用下面的数据源连接//DriverManagerDataSource  datasource=new DriverManagerDataSource ();datasource.setUrl(dbUrl);datasource.setUsername(username);datasource.setPassword(password);datasource.setDriverClassName(driverClassName);datasource.setSchema(schema);return datasource;}//事务处理异常的类@Bean(name = "mysqlTransactionManager")@Primarypublic DataSourceTransactionManager masterTransactionManager() {return new DataSourceTransactionManager(masterDataSource());}@Bean(name = "mysqlSqlSessionFactory")@Primarypublic SqlSessionFactory masterSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(mysqlDataSource);      // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MasterDbConfig.MAPPER_LOCATION));//domain的具体路径,读取do类和数据库表的映射sessionFactory.setTypeAliasesPackage(DOMAIN_PACKAGE);// 设置分页sessionFactory.setPlugins(mybatisPlusInterceptor);//mybatis 数据库字段与实体类属性驼峰映射配置sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);return sessionFactory.getObject();}@Bean(name = "db1SqlSessionTemplate")@Primarypublic SqlSessionTemplate dbSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory)  {return new SqlSessionTemplate(sqlSessionFactory);}
}

配置数据源pgsql的连接信息,包含配置数据库连接信息,扫描对应的实体类路径。

package com.xbz.common.config;import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
import java.sql.SQLException;/*** 从数据源配置* 若需要配置更多数据源 , 直接在yml中添加数据源配置再增加相应的新的数据源配置类即可*/
@Configuration
@MapperScan(basePackages  ={"com.biz.data.process.mapper.op", //配置数据源需要读取的mapper文件路径,也就是需要在这个数据源下执行的sql"com.biz.data.process.mapper.npa","com.biz.data.process.mapper.cust"} , sqlSessionFactoryRef = "clusterSqlSessionFactory")
public class PgsqlDbConfig {private Logger logger = LoggerFactory.getLogger(PgsqlDbConfig .class);// 精确到 cluster 目录,以便跟其他数据源隔离static final String PACKAGE = "com.xbz.**.dao.cluster";private static final String MAPPER_LOCATION = "classpath*:mapper/cluster/*.xml";private static final String DOMAIN_PACKAGE = "com.xbz.**.domain";@Value("${spring.datasource.url2}")private String dbUrl;@Value("${spring.datasource.username2}")private String username;@Value("${spring.datasource.password2}")private String password;@Value("${spring.datasource.driverClassName}")private String driverClassName;@AutowiredMybatisPlusInterceptor mybatisPlusInterceptor; //分页插件注入@Bean(name="pgsqlDataSource")   //声明其为Bean实例public DataSource pgsqlDataSource() {//不适用Druid时,使用下面的数据源连接//DriverManagerDataSource  datasource=new DriverManagerDataSource ();     DruidDataSource datasource = new DruidDataSource();datasource.setUrl(dbUrl);datasource.setUsername(username);datasource.setPassword(password);datasource.setDriverClassName(driverClassName);return datasource;}@Bean(name = "pgsqlTransactionManager")public DataSourceTransactionManager clusterTransactionManager() {return new DataSourceTransactionManager(clusterDataSource());}@Bean(name = "pgsqlSqlSessionFactory")public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("pgsqlDataSource") DataSource pgsqlDataSource)throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(pgsqlDataSource);// mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(ClusterDbConfig.MAPPER_LOCATION));sessionFactory.setTypeAliasesPackage(DOMAIN_PACKAGE);/ 设置分页sessionFactory.setPlugins(mybatisPlusInterceptor);//mybatis 数据库字段与实体类属性驼峰映射配置sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);return sessionFactory.getObject();}
}

不同的数据源配置不同的mapper扫描位置,需要查询哪一个数据源的数据,就直接调用该数据源对应的mapper类文件(位于Domain包下)就可以。

MybatisPlus分页配置

package com.whut.multisource.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** MybatisPlus分页配置*/
@Configuration
public class MybatisPlusConfig {/*** 分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));return interceptor;}}

注意点:
编写mapper层,其中不同数据源对应的mapper要分包编写,也就是不同数据源对应的mapper文件要放在domian不同的包下,mapeer文件对应的sql.xml文件最好也要分开写,不然可能会有问题,可以参考如下的方式配置mapper的路径,
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国失业率大幅上升,增加九月份降息利率的可能性

令人失望的是&#xff0c;美国7月份经济增加了11.4万个工作岗位&#xff0c;低于预期的17.5万个和6月的17.9万个。平均小时工资持续下降&#xff0c;但失业率升至4.3%。美元继续走低&#xff0c;美国国债也在下跌&#xff0c;而黄金则获得了提振。 7月份的非农业支付数据令人失…

鸿蒙 IM 即时通讯开发实践,融云 IM HarmonyOS NEXT 版

融云完成针对“纯血鸿蒙”操作系统的 SDK 研发&#xff0c;HarmonyOS NEXT 版融云 IM SDK 已上线&#xff0c;开发者可在“鸿蒙生态伙伴 SDK 市场”查询使用。 发挥 20 年通信行业技术积累和领创品牌效应&#xff0c;融云为社交、娱乐、游戏、电商、出行、医疗等各行业提供专业…

react引入高德地图并初始化卫星地图

react引入高德地图并初始化卫星地图 1.安装依赖 yarn add react-amap amap/amap-jsapi-loader2.初始化地图 import AMapLoader from "amap/amap-jsapi-loader"; import { FC, useEffect, useRef, useState } from "react";const HomeRight () > {con…

普通人有必要学Python吗?学了之后能做什么?

目录 首先来说一下极其推荐的方向&#xff1a; 1、数据分析 2、科学计算 3、大数据框架 4、脚本开发 5、爬虫 6、Web框架 总结&#xff1a; 如果你还没有开始使用Python&#xff0c;答应我&#xff0c;把这个回答看完&#xff0c;如果你真的学习并深入使用过Python&…

我的最爱之《达明一派》

达明一派&#xff0c;是我最爱。刘以达(Tats)与黄耀明(Anthony Wong)在1980年代的香港组成的二人流行音乐组合&#xff0c;在90年代&#xff0c;网络还没兴起时&#xff0c;那是卡带流行的岁月。90年代&#xff0c;我与好友&#xff0c;同考大学&#xff0c;他留在了南充读读书…

使用labelme生成mask数据集(亲测可行)

1、下载label.exe文件 链接&#xff1a;github地址 2、安装一下anaconda&#xff0c;百度一下直接安装就行 3、打开labelme.exe文件&#xff0c;直接加载图片&#xff0c;然后编辑多边形&#xff0c;就是mask的位置 4、画好mask了&#xff0c;保存为json文件&#xff0c;记住这…

【qiankun微前端】基座主应用(vue2)+多个微应用(任意框架)

前言 前段时间对我们已有的工程进行了微前端改造,后来思考一下微前端的本质,查询了不少资料,从qiankun微前端示例中学到了不少。 微前端的核心,似乎应该是一个基座应用(含登录页,layout页,404和首页等),多个子应用(任意框架,提供内部页面内容),下面就对这个思路…

stm32入门-----软件I2C读写MPU6050

目录 前言 MPU6050 1.简介 2.相关参数 3.硬件电路 4.MPU6050框图 C编程实现I2C读写MPU6050步骤 1.MyI2C.c文件 &#xff08;1&#xff09;引脚的宏定义 &#xff08;2&#xff09;对SCL和SDA的操作以及初始化 &#xff08;3&#xff09;起始信号标志 &#xff08;4…

数据结构(面试)

目录 线索二叉树哈夫曼树并查集最小生成树最短路径拓扑排序二叉排序树平衡二叉树红黑树折半查找散列表堆排序归并排序 线索二叉树 原理&#xff1a;利用树节点的n1个左右空指针指向其遍历序列的前驱和后继&#xff08;线索&#xff09; 优点&#xff1a;简化遍历&#xff0c;不…

7.2 单变量(多->多),attention/informer

继续上文书写&#xff1a; 1 GRU Attention 收敛速度稳定的很多&#xff0c;你看这些模型是不是很容易搭&#xff0c;像积木一样&#xff1b; def create_model(input_shape, output_length,lr1e-3, warehouse"None"):input Input(shapeinput_shape)conv1 Conv…

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参&#xff08;默认&#xff09;构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

免费【2024】springboot 大学生志愿者管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

windows下设置java环境变量

1.打开window的环境变量设置 右键开始菜单选择系统 选择高级系统设置&#xff1a; 点击环境变量 2.在系统变量 新增 JAVA_HOME&#xff1b;该变量的值 选择jdk所在的目录即可。 JAVA_HOME: D:\Program Files\Java\jdk1.8.0_131 3. 在系统变量新增 classpath; 该变量的值设置…

GoLang 安装

golang学习笔记 goland 安装 To use Go programming language in Visual Studio Code (VSCode), you can follow these steps: 1. Install Go: Download and install the latest version of Go from the official Go website (https://golang.org/dl/). 2. Install VSCode:…

llama-3.1下载部署

llama-3.1 下载部署 下载 huggingface 详情页填写申请后等待审核 点击 头像->setting->access token 创建token 配置环境变量 下载模型 pip install -U huggingface_hubhuggingface-cli download --resume-download meta-llama/Meta-Llama-3.1-8B-Instruct --loca…

IDEA的疑难杂症

注意idea版本是否与maven版本兼容 2019idea与maven3.6以上不兼容 IDEA无法启动 打开idea下载安装的目录:如:Idea\IntelliJ IDEA 2024.1\bin 在bin下面找到 打开在最后一行添加暂停 pause 之后双击运行idea.bat 提示找不到一个jar包,切记不要有中文目录 IDEA缓存 …

Java与Python谁更适合后端开发?

在软件开发的世界里&#xff0c;选择合适的编程语言就像为建筑选择合适的材料一样重要。 对于后端开发而言&#xff0c;Java和Python都是流行的选择&#xff0c;但它们各自拥有独特的优势和劣势&#xff0c;“谁更适合”就成为一个被议论的话题。 事实上&#xff0c;并不存在…

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题&#xff1a; 用于图像分类的可扩展量子非局部神经网络 作者&#xff1a; Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接&#xff1a;https://arxiv.org/abs/2407.18906 摘要&#x…

[BJDCTF2020]Easy MD51

抓包看一下信息&#xff0c;发现有sql注入字段 输入 注入发现 查看源码 然后get传参?aQNKCDZO&bs214587387a 最后 MD5函数的弱类型比较 发现PHP代码&#xff0c;分析仍为 PHP md5绕过。 使用数组绕过POST传入param1[]1&param2[]2&#xff0c;得到flag。

RIP综合练习

要求&#xff1a; 1.合理使用IP地址划分网络&#xff0c;各自创建循环接口 2.R1创建环回172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1,R2之间增加路由传递安全性 5.R5创建一个环回模拟运营商&#xff0c;不能…