Spring JdbcTemplate JpaRepository 数据库配置多个数据源连接、查询

  所谓多数据源,就是一个项目中采用了不同数据库实例中的多个库,或者同一个数据库实例中多个不同的库。比如实现数据库读写分离、分库分表、备份等操作。
  JdbcTemplate多数据源的配置是比较简单的,因为一个JdbcTemplate对应一个DataSource,开发者只需要手动提供多个DataSource,再手动配置JdbcTemplate即可。
  JPA多数据源的配置需要指定对应的Entity实体和Repository定义的位置,用@Primary来区分主数据源。

一、配置yml文件

server:port: 8080
spring:profiles:active: devjackson:time-zone: GMT+8  # 这里是我们的数据库配置地方    
datasource:first:  #这里是数据库一driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:sqlserver://localhost:1433;DatabaseName=name1username: ***password: ***type: com.alibaba.druid.pool.DruidDataSourcesecond:  #这里是数据库二driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:sqlserver://localhost:1433;DatabaseName=name2username: ***password: ***type: com.alibaba.druid.pool.DruidDataSource

二、创建数据源配置类 DatasourceConfig .class

定义两个DataSource来读取application.yml中的不同配置。

@Configuration
public class DataSourceConfig {@Primary //标记一个主数据库@Bean(name = "firstDataSource")@Qualifier("firstDataSource")@ConfigurationProperties(prefix = "spring.datasource.first")public DataSource firstDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondDataSource")@Qualifier("secondDataSource")@ConfigurationProperties(prefix="spring.datasource.second")public DataSource secondDataSource() {return DataSourceBuilder.create().build();}}

三、配置 JdbcTemplate Config 或JPA Config

1. 配置 JdbcTemplateConfig

(1)项目只要引入了 spring-jdbc 依赖,如果开发者没有提供 JdbcTemplate 实例时,Spring Boot 默认会提供一个 JdbcTemplate 实例。
(2)如果配置多数据源时,由开发者自己提供 JdbcTemplate 实例,代码如下:

JdbcTemplateConfig .class

@Configuration
public class JdbcTemplateConfig {@Primary@Bean("firstJdbcTemplate")public JdbcTemplate firstJdbcTemplate(@Qualifier("firstDataSource")DataSource dataSource){return new JdbcTemplate(dataSource);}@Bean("secondJdbcTemplate")public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource")DataSource dataSource){return new JdbcTemplate(dataSource);}
}
2. 配置 JPA Config

  JPA指定数据源需要指定对应的Entity实体和Repository定义的位置,用@Primary来区分主数据源。

(1)first数据源的JPA配置 (FirstDataBaseConfig.class

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(// 配置连接工厂entityManagerFactoryRef = "firstFactory",// 配置事物管理器transactionManagerRef = "firstTransaction",// 设置Jpa first数据源的 repository所在位置basePackages = {"com.xx.xx.xx.**.repository"}
)public class FirstDataBaseConfig {@Autowired@Qualifier("firstDataSource")private DataSource firstDataSource;@Autowiredprivate JpaProperties jpaProperties;@Autowiredprivate HibernateProperties properties;// 以下是jpa的配置/*** 连接工厂* @param builder 创建工具* @return 结果*/@Bean(name = "firstFactory")public LocalContainerEntityManagerFactoryBean firstFactory(EntityManagerFactoryBuilder builder) {return builder// 设置数据源.dataSource(firstDataSource)//设置实体类所在位置.扫描所有带有 @Entity 注解的类.packages("xx.xx.xx.first.**.entity")// Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,// Repository就能用它来创建 EntityManager 了,然后 EntityManager 就可以针对数据库执行操作.persistenceUnit("first")// 为了加载yml中jpa下hibernate的相关配置.properties(properties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings())).build();}/*** 配置事物管理器** @param builder 创建工具* @return 结果*/@Bean(name = "firstTransaction")PlatformTransactionManager firstTransaction(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(Objects.requireNonNull(firstFactory(builder).getObject()));}

(2)second数据源的JPA配置( SecondDataBaseConfig.class

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(// 配置连接工厂entityManagerFactoryRef = "secondFactory",// 配置事物管理器transactionManagerRef = "secondTransaction",// 设置Jpa second数据源的 repository所在位置basePackages = {"com.xx.xx.xx.**.repository"}
)public class SecondDataBaseConfig {@Autowired@Qualifier("secondDataSource")private DataSource secondDataSource;@Autowiredprivate JpaProperties jpaProperties;@Autowiredprivate HibernateProperties properties;// 以下是jpa的配置/*** 连接工厂* @param builder 创建工具* @return 结果*/@Bean(name = "secondFactory")public LocalContainerEntityManagerFactoryBean secondFactory(EntityManagerFactoryBuilder builder) {return builder// 设置数据源.dataSource(secondDataSource)//设置实体类所在位置.扫描所有带有 @Entity 注解的类.packages("xx.xx.xx.second.**.entity")// Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,// Repository就能用它来创建 EntityManager 了,然后 EntityManager 就可以针对数据库执行操作.persistenceUnit("second")// 为了加载yml中jpa下hibernate的相关配置.properties(properties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings())).build();}/*** 配置事物管理器** @param builder 创建工具* @return 结果*/@Bean(name = "secondTransaction")PlatformTransactionManager secondTransaction(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(Objects.requireNonNull(secondFactory(builder).getObject()));}

四、实例化使用

(1)JdbcTemplate实例化

@RestController
public class Controller {@Resource(name = "firstJdbcTemplate")private JdbcTemplate firstJdbcTemplate;@Resource(name = "secondJdbcTemplate")private JdbcTemplate secondJdbcTemplate;@PostMapping("/testSave")public String test(){// SQL查询数据库1String SQL1 = "SELECT * FROM dataBaseName1";List<> list1 = firstJdbcTemplate.queryForList(SQL1);// SQL查询数据库2String SQL2 = "SELECT * FROM dataBaseName2";List<> list2 = secondJdbcTemplate.queryForList(SQL2);}
}

(2)JPA只需要将不同数据源的Entity实体和Repository定义放到对应的位置,直接使用。

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

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

相关文章

分布式搜索引擎-elasticsearch基础

分布式搜索引擎-elasticsearch基础 1、什么是elasticsearch&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&a…

个人博客系列-后端项目-用户验证(5)

介绍 创建系统管理app&#xff0c;用于管理系统的用户&#xff0c;角色&#xff0c;权限&#xff0c;登录等功能&#xff0c;项目中将使用django-rest_framework进行用户认证和权限解析。这里将完成用户认证 用户验证 rest_framework.authentication模块中的认证类&#xff…

【C++】priority_queue和仿函数

priority_queue翻译过来就是优先队列&#xff0c;其实就是我们数据结构中的堆。堆这个东西之前也说过&#xff0c;它分为大根堆和小根堆&#xff0c;它的底层是一个类似数组的连续的空间&#xff0c;逻辑结构是一个完全二叉树&#xff0c;这个完全二叉树如果是小根堆的话父亲小…

Vue-03

Vue指令 v-bind 作用&#xff1a;动态设置html的标签属性&#xff08;src url title…&#xff09; 语法&#xff1a;v-bind:属性名"表达式" 举例代码如下&#xff1a; 实现效果如下&#xff1a; 案例&#xff1a;图片切换 实现代码如下&#xff1a; 实现的效果…

Redis面试问题纯享版

基础内容 1、简单介绍以下你了解的Redis 2、对比一下Redis和Memcache的异同&#xff1f; 3、为什么MySQL选用Redis作为缓存&#xff1f; 4、详细聊聊你对Redis各种数据类型的了解&#xff1f; 5、Redis中五种基本数据类型的底层数据结构是什么样的&#xff1f; Redis线程模型…

好物周刊#43:设计素材下载

https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. frp 一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c…

大华IPC网络摄像机如何保存视频

一、背景 通常网络相机&#xff08;IPC&#xff09;不会自带存储功能&#xff0c;需要接入录像机&#xff08;NVR&#xff09;进行保存。 其中NVR也分软件存储及硬件存储&#xff0c;这里不提&#xff0c;这边单独说FTP存储 二、配置前提 要配置FTP存储需要&#xff1a;①网络…

centos7迁移龙蜥anolis8.8-内网

一、离线仓库搭建 在内网搭建龙蜥镜像站 CentOS7下同步阿里云CentOS7镜像建本地yum仓库基本步骤 1、更新本地yum-关闭防火墙 # 将vim设置为黏贴模式&#xff0c;防止复制时自动缩进 echo "set paste" >> /root/.vimrc#设置防火墙为 Iptables 并设置空规则 s…

初识openGauss

一、openGauss 的介绍 openGauss 是一款全面友好开放&#xff0c;携手伙伴共同打造的企业级开源关系型数据库。openGauss 提供面向多核架构的极致性能、全链路的业务、数据安全、基于 AI 的调优和高效运维的能力。openGaus 深度融合华为在数据库领域多年的研发经验&#xff0c…

【python进阶篇】面向对象编程(1)

面向对象编程——Object Oriented Programming&#xff0c;简称OOP&#xff0c;是一种程序设计思想。OOP把对象作为程序的基本单元&#xff0c;一个对象包含了数据和操作数据的函数。 在Python中&#xff0c;所有数据类型都可以视为对象&#xff0c;当然也可以自定义对象。自定…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型&#xff0c;可以绘制动漫、3D、科幻、真实等类型的图片。 …

pyqt进入当前系统shell界面

在PyQt中可以使用QProcess类来运行外部命令并获取其输出。要进入当前系统的Shell界面&#xff0c;可以通过调用操作系统相关的命令来完成。 下面是一个示例代码&#xff0c;展示了如何在PyQt应用程序中打开当前系统的Shell界面&#xff1a; import sys from PyQt5.QtWidgets …

【开源物联网平台】FastBee认证方式和MQTT主题设计

&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…

Unity 动画(旧版-新版)

旧版 旧版-动画组件&#xff1a;Animation 窗口-动画 动画文件后缀: .anim 将制作后的动画拖动到Animation组件上 旧版的操作 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// Start is called before…

C语言学习--摩尔投票算法

目录 1.引入 2.摩尔投票算法 3.具体步骤 3.1抵消阶段 3.2检验过程 4.代码实现 5.总结 1.引入 今天做题看到一个解题思路真的看不懂&#xff0c;一艘才知道是这个算法。 int majorityElement(int* nums, int numsSize) { int notenums[0]; int count1; for(int i1;i<n…

MES+APS难度地狱级,搞定它就是劫后余生呀。

一、什么是MES和APS MES&#xff08;Manufacturing Execution System&#xff09;和APS&#xff08;Advanced Planning and Scheduling&#xff09;是两种在制造业中常用的软件系统&#xff0c;用于优化生产过程和提高生产效率。 MES是一种用于管理和监控制造过程的系统。它与…

稀碎从零算法笔记Day11-LeetCode:有效的字母异位词

题型&#xff1a;字符串、哈希表、排序 链接&#xff1a;242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 …

SAP Parallel Accounting(平行分类账业务)配置及操作手册(超详细的说明和测试)

SAP Parallel Accounting(平行分类账业务)配置及操作手册 1、Overview 为了适应不同的会计准则&#xff0c;SAP在新总账中启用了多分类账&#xff0c;&#xff08;其作用简单来说就是&#xff0c;同时一笔记账&#xff0c;会产生多个账套的凭证。&#xff09;分类账可以对应一…

C#使用Queue<T>类进行队列设计

目录 一、涉及到的知识点 1.Queue类 2.Queue类的方法和属性 二、使用C# Queue类的实例 一、涉及到的知识点 1.Queue类 C#中确实提供了队列类Queue。队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;用于存储和操作对象的有序集合。在C#中&#xff0…

搜索-BFS Meteor Shower S(流星雨)

Meteor Shower S&#xff08;流星雨&#xff09; 题目连接 题目描述 贝茜听说一场特别的流星雨即将到来&#xff1a;这些流星会撞向地球&#xff0c;并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑&#xff0c;发誓要找到一个安全的地方&#xff08;一个永远不会被流星…