【Spring实战】配置多数据源

文章目录

    • 1. 配置数据源信息
    • 2. 创建第一个数据源
    • 3. 创建第二个数据源
    • 4. 创建启动类及查询方法
    • 5. 启动服务
    • 6. 创建表及做数据
    • 7. 查询验证
    • 8. 详细代码
    • 总结

通过上一节的介绍,我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中,可能需要访问多个数据库,每个数据库可能负责不同的业务功能或数据存储。 那么,如果我们程序中需要两个或者两个以上数据源该怎么办呢? 本文将介绍如何使用 Spring 实现多数据源的配置和使用。

在这里插入图片描述

1. 配置数据源信息

在创建数据源之前,我们先预先定义好两个数据源的信息,注意前缀要区分开。

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console# 创建第一个数据源信息
spring.datasource.jdbc-url=jdbc:h2:mem:db1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=# 创建第二个数据源信息
spring.datasource2.jdbc-url=jdbc:h2:mem:db2
spring.datasource2.driverClassName=org.h2.Driver
spring.datasource2.username=sa
spring.datasource2.password=

2. 创建第一个数据源

创建第一个 Datasource1Config.java 文件,然后使用 @Configuration 注解声明这是一个配置类。再使用 @Bean 配合 @ConfigurationProperties 来获取数据源的信息用来创建 dataSourcejdbcTemplate 以备后面查询使用。

package com.cheney.demo.config;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.core.JdbcTemplate;
import javax.sql.DataSource;@Configuration
public class Datasource1Config {@Bean@ConfigurationProperties("spring.datasource")public DataSource dataSource(){return DataSourceBuilder.create().build();}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource){return new JdbcTemplate(dataSource);}
}

3. 创建第二个数据源

创建第一个 Datasource2Config.java 文件,然后使用 @Configuration 注解声明这是一个配置类。再使用 @Bean 配合 @ConfigurationProperties 来获取数据源的信息用来创建 dataSource2jdbcTemplate2 以备后面查询使用。

package com.cheney.demo.config;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.core.JdbcTemplate;
import javax.sql.DataSource;@Configuration
public class Datasource2Config {@Bean@ConfigurationProperties("spring.datasource2")public DataSource dataSource2(){return DataSourceBuilder.create().build();}@Beanpublic JdbcTemplate jdbcTemplate2(@Qualifier("dataSource2") DataSource dataSource){return new JdbcTemplate(dataSource);}
}

4. 创建启动类及查询方法

创建了一个正常的 Spring 启动类,分别注入了两套 JdbcTemplate 和 对外访问接口。

package com.cheney.demo;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLException;@SpringBootApplication
@RestController
@Slf4j
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Autowiredprivate JdbcTemplate jdbcTemplate;@Autowiredprivate JdbcTemplate jdbcTemplate2;@RequestMapping("db1")public String getUserFromDataSource1() throws SQLException {return jdbcTemplate.queryForList("select * from t_user").toString();}@RequestMapping("db2")public String getUserFromDataSource2(){return jdbcTemplate2.queryForList("select * from t_user").toString();}
}

5. 启动服务

通过控制台,我们可以看到启动了两个数据库连接分别是 conn0conn1 并且都打印出了 RUL 等信息

在这里插入图片描述

6. 创建表及做数据

1)使用 h2 数据库控制台连接 db1 ,创建表并登陆数据

访问下面 URL

http://localhost:8080/h2-console

使用 application.properties 里定义的第一个数据源的 URL 进行连接

在这里插入图片描述

点击 Connect 按钮,进入控制台。输入 建表语句并插入一条数据

在这里插入图片描述

CREATE TABLE IF NOT EXISTS `t_user` (`id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,`name`       VARCHAR(32) NOT NULL,`age`        INTEGER  NOT NULL
);
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (1, 'cheney', '11');

点击 Run(绿色三角图标)

在这里插入图片描述

这就完成了对数据源1的建表和做数据(注意此条数据 age 是 11

1)使用 h2 数据库控制台连接 db2 ,创建表并登陆数据

连接方法一致,此时执行 sql

CREATE TABLE IF NOT EXISTS `t_user` (`id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,`name`       VARCHAR(32) NOT NULL,`age`        INTEGER  NOT NULL
);
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (1, 'cheney', '22');

点击 Connect 按钮,进入控制台。输入 建表语句并插入一条数据,点击 Run(绿色三角图标)

在这里插入图片描述

这就完成了对数据源1的建表和做数据(注意此条数据 age 是 22

7. 查询验证

使用浏览器,先访问第一个数据源,使用如下 URL

http://localhost:8080/db1

在这里插入图片描述

和我们之前插入数据库的值一样, age 是 11

使用浏览器,先访问第二个数据源,使用如下 URL

http://localhost:8080/db2

在这里插入图片描述

和我们之前插入数据库的值一样, age 是 22

这样就可以分开使用数据库了,此处我们使用了两个数据源都是 h2 数据库,你也可以使用两个不一样的数据库。此处仅做了查询,你也可以做 insert 或者 update 等等。

8. 详细代码

https://github.com/cheney09/spring-practical-combat/tree/main/02/demo

在这里插入图片描述

总结

本文将介绍如何使用 Spring 实现多数据源,通过一个简单的 Spring 多数据源的配置和使用示例。实际项目中,你可能需要根据具体需求进行更复杂的配置和逻辑。希望这个示例能够帮助你理解如何在 Spring 应用程序中使用多个数据源。

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

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

相关文章

CVE-2023-49898 Apache incubator-streampark 远程命令执行漏洞

项目介绍 Apache Flink 和 Apache Spark 被广泛用作下一代大数据流计算引擎。基于大量优秀经验结合最佳实践,我们将任务部署和运行时参数提取到配置文件中。这样,带有开箱即用连接器的易于使用的 RuntimeContext 将带来更轻松、更高效的任务开发体验。它…

【clickhouse】在CentOS中离线安装clickhouse

一、下载地址 通过以下链接进行rpm安装包的下载 https://packages.clickhouse.com/rpm/stable/ 根据需求下载对应版本 注意:ClickHouse 20.8.2.3版本新增加了 MaterializeMySQL 的 database 引擎,该 database 能映射到 MySQL 中的某个 database&#…

NativePHP:使用 PHP 构建桌面应用程序

PHP 在我心中占据着特殊的位置。它是我的第一份工作,我记得我在家里花了无数个小时做一些小项目。我非常想用 PHP 创建桌面应用程序,但我从来没有做到过。 现在,感谢 NativePHP,我可以了。 NativePHP 追随 Slack、Discord 和 Tre…

easyexcel复杂表头导出

easyexcel复杂表头导出 /*** ClassName ColumnWidthStyleStrategy* Description: excel导出列长度**/ public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {private static final int MAX_COLUMN_WIDTH 200;private final Map<Integer, Map…

macOS下载

macOS 下载 历史版本下载地址&#xff1a; https://support.apple.com/zh-cn/HT211683 例&#xff1a; macOS 11 Big sur: https://apps.apple.com/cn/app/macos-big-sur/id1526878132?mt12

二维码智慧门牌管理系统升级:安全与便捷并存

文章目录 前言一、系统升级与用户操作记录二、展望与智能门禁未来三、智能科技为未来铺路 前言 科技与门禁系统演进 随着科技的飞速发展&#xff0c;智能门牌系统成为建筑物不可或缺的一部分。其中&#xff0c;二维码智慧门牌管理系统以其独特优势逐渐受到关注。它不仅提升了出…

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】

文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中&#xff0c;SAU&#xff08;Security Attribution Unit&#xff09;是安全属性单元&#xff0c;用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…

MATLAB - 机器人逆运动学设计器(Inverse Kinematics Designer APP)

系列文章目录 前言 一、简介 通过逆运动学设计器&#xff0c;您可以为 URDF 机器人模型设计逆运动学求解器。您可以调整逆运动学求解器并添加约束条件&#xff0c;以实现所需的行为。使用该程序&#xff0c;您可以 从 URDF 文件或 MATLAB 工作区导入 URDF 机器人模型。调整逆…

智能优化算法应用:基于晶体结构算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于晶体结构算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于晶体结构算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.晶体结构算法4.实验参数设定5.算法结果6.…

MyBatis见解3

8.MyBatis的关联查询 8.3.一对多查询 需求&#xff1a;查询所有用户信息及用户关联的账户信息。 分析&#xff1a;用户信息和他的账户信息为一对多关系&#xff0c;并且查询过程中如果用户没有账户信息&#xff0c;此时也要将用户信息查询出来&#xff0c;此时左外连接查询比…

Android Matrix画布Canvas缩放scale,Kotlin

Android Matrix画布Canvas缩放scale&#xff0c;Kotlin val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.ARGB_8888)val canva…

P1883 函数

题目链接 P1883 函数 思路 举例 题目中的 F ( x ) F(x) F(x) 看起来很复杂&#xff0c;但由于每个 f ( x ) f(x) f(x) 的二次项系数 a a a 都不是负数&#xff0c;故 F ( x ) F(x) F(x) 是一个单谷函数。直接说出结论可能有些令人难以接受&#xff0c;不妨举出两个例子…

Ubuntu环境下使用Livox mid 360

参考文章&#xff1a; Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一&#xff1a;Livox mid 360驱动安装与测试 前言&#xff1a; Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部…

FastAPI实现文件上传下载

FastAPI实现文件上传下载 1.后端FastAPI2.后端html3.效果 最近的项目需求&#xff0c;是前端vue&#xff0c;后端fastAPI&#xff0c;然后涉及到图像的消息发送&#xff0c;所以需要用fast写文件上传下载的接口&#xff0c;这里简单记录一下。 1.后端FastAPI import os.path i…

.net core webapi 大文件上传到wwwroot文件夹

1.配置staticfiles(program文件中) app.UseStaticFiles();2.在wwwroot下创建upload文件夹 3.返回结果封装 namespace webapi;/// <summary> /// 统一数据响应格式 /// </summary> public class Results<T> {/// <summary>/// 自定义的响应码&#xff…

H266/VVC帧内预测编码

预测编码技术 预测编码&#xff08;Prediction Coding&#xff09;是指利用已编码的一个或多个样本值&#xff0c;根据某种模型或方法&#xff0c;对当前的样本值进行预测&#xff0c;并对样本真实值和预测值之间的差值进行编码。 视频中的每个像素看成一个信源符号&#xff…

python3 数据分析项目案例,用python做数据分析案例

本篇文章给大家谈谈python3 数据分析项目案例&#xff0c;以及用python做数据分析案例&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 目录 一丶可视化绘图案例 1.曲线图 2.柱形图 3.点线图 4.3D散点图 5. 绘制漏斗图 6. 绘制词云图 二丶包/模块使用示例 (1)…

高通切换到Emergency Download:adb reboot edl

刷机 开机下adb reboot edl 切到QDloader 9008 点下载。 The command “adb reboot edl” is used to reboot an Android device into EDL (Emergency Download) mode using the Android Debug Bridge (ADB) tool. EDL mode is primarily used for low-level firmware flashing…

数据结构---算法的空间复杂度

文章目录 空间复杂度概念实例 空间复杂度 概念 空间复杂度也是一个数学表达式&#xff0c;是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是变量的个数。…

LLM之RAG实战(八)| 使用Neo4j和LlamaIndex实现多模态RAG

人工智能和大型语言模型领域正在迅速发展。一年前&#xff0c;没有人使用LLM来提高生产力。时至今日&#xff0c;很难想象我们大多数人或多或少都在使用LLM提供服务&#xff0c;从个人助手到文生图场景。由于大量的研究和兴趣&#xff0c;LLM每天都在变得越来越好、越来越聪明。…