【Spring实战】02 配置多数据源

文章目录

    • 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/245960.shtml

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

相关文章

java getxxx_java的invoke与getMethod方法用法

和listener一起使用举例:需要在控件中监听某个动作:比如button点击,画面滚动等1.为控件定义一个属性:属性绑定一个方法xxxProperty "onPropertyXxxxFunc”2.首先自定义一个Listener// 在控件构造函数中获得控件属性的值xxxPr…

windows查看usb信息命令_【VPS】Linux VPS查看系统信息命令大全

本文转自老左笔记,自用mark系统# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加…

c++ 向量的值逆序输出_C++中vector的常用方法

前言在C中,vector是一个商业转载请联系作者获得授权,非商业转载请注明出处。十分有用的容器。它能像容器一样存放各种类型的对象,简单来说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。相较链表而言&…

java生成密码_java生成密码生成 | 学步园

一、根据当前日期生成MD5加密密码package com.test;import java.security.MessageDigest;import java.text.SimpleDateFormat;import java.util.Date;public class Md5Test {public void toMD5(String plainText) {try {//生成实现指定摘要原文链接:http://www.cnbl…

python怎么创建一个二维数组_python 创建二维数组的方法

废话不多说,直接上代码:#codingutf-8def two_di_demo1():a[]for i in range(10):a.append([])for j in range(10):a[i].append(0)print(a)def two_di_demo2():a[]for i in range(10):a.append([])for j in range(10):a[i].append(0)print(a)b [[0] * 10…

java导出excel到本地_POI导出Excel----导出到客户端(本地)

contentType"application/vnd.ms-excel;charsetutf-8"pageEncoding"utf-8"%>//导入要用的包import"org.apache.poi.hssf.usermodel.HSSFWorkbook"%>import"java.io.FileOutputStream"%>import"org.apache.poi.hssf.user…

无法初始化sftp协议。主机是sftp服务器吗?_WinSCP v5.15.3 免费的 开源图形化 SFTP 客户端...

WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。主要功能WinSCP 可以执行所有基本的文件操作,例如下载和上传。同时允许为文件和目录重…

java中组合_java中组合模式详解和使用方法

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创…

道客巴巴vip账号共享2020_腾讯视频VIP怎么两个手机通用?

理论上来说,腾讯视频VIP可以同时在3个设备上登录,但只能在2个设备上同时播放视频。这也就意味着,腾讯视频VIP可以在两个手机上同时使用。腾讯视频VIP基本可以分为微信区、QQ区,两者并不互通。近期腾讯视频手机端修改了登录规则&am…

python3示例_Python3 实例(七)

原标题:Python3 实例(七)Python 将字符串的时间转换为时间戳给定一个字符串的时间,将其转换为时间戳。实例import timea1 "2019-5-10 23:40:00"# 先转换为时间数组timeArray time.strptime(a1, "%Y-%m-%d %H:%M:%S")# 转换为时间戳…

java基础知识一_Java基础知识(一)

类与对象1.对象:客观存在的一切事物称之为对象类:具有相同属性和方法的对象的集合2.类:属性,方法3.修饰符:  public    protected               默认(不写)           private任何地…

python生成相似句子_4种方法计算句子相似度

Edit Distance计算两个字符串之间,由一个转成另一个所需要的最少编辑次数,次数越多,距离越大,也就越不相关。比如,“xiaoming”和“xiamin”,两者的转换需要两步:去除‘o’去除‘g’所以&#x…

mysql主从配置常见问题_mysql 主从复制配置,以及常见问题解决!

一:我的mysql 5.7.15 ,系统是centos6.5主从复制配置步骤:瞅清楚!配置不要出错!!二:遇到的问题Got fatal error 1236 from master when reading data from binary log解决方案:在ma…

pythontcp文件传输_python socket实现文件传输(防粘包)

1.文件传输的要点:采用iterator(迭代器对象)迭代读取,提高读取以及存取效率;通过for line in file_handles逐行conn.send();2.socket粘包问题:[出现原因]:A.TCP协议为了提高传输效率,发送方往往需要收集定量…

python分析txt文件_python解析文本文件

python解析的文件原始数据:汉皇重色思倾国,御宇多年求不得。杨家有女初长成,养在深闺人未识。天生丽质难自弃,一朝选在君王侧。回眸一笑百媚生,六宫粉黛无颜色。春寒赐浴华清池,温泉水滑洗凝脂。侍儿扶起娇…

python中hist函数参数_用hist参数解释Python,python,解读

python用hist参数解读python 中绘制hist的方法有很多,我经常用的是matplotlib直接用x,y绘制;Dataframe直接.hist绘制;绘制直方图1.bins为80的图形fig plt.figure(figsize(15, 9))for i in range(12):plt.subplot(3,4,i1) # 3行4列 位置是i1的…

java 字符串是对象吗_解析Java中的String对象的数据类型

解析Java中的String对象的数据类型2007-06-06eNet&Ciweek1. 首先String不属于8种基本数据类型,String是一个对象。因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。2. …

7-7 六度空间 (30分)_现役球员中,谁最可能成下一位30000分先生?3大前十巨星没戏...

想要在NBA联盟得到3万分有多难?从联盟成立至今的70多年中,总得分超过3万分的球员一共只有7位,他们分别是贾巴尔、马龙、詹姆斯、科比、乔丹、诺维茨基和张伯伦,剩下的强如大鲨鱼、艾弗森都没能完成这一壮举,那现役球员…

java右键弹出菜单_javascript自定义右键弹出菜单实现方法

本文实例讲述了javascript自定义右键弹出菜单实现方法。分享给大家供大家参考。具体实现方法如下:无标题页var oPopup window.createPopup();function PopMenu(id){var oPopBody oPopup.document.body;oPopBody.style.backgroundColor "buttonface";oP…

union all动态表_Excel VBA——动态显示图表

本文讲述将柱形图和折线图做成动态图表的方法。所谓动态是指鼠标点到哪个单元格,就显示活动单元格所在列或行的图表,其中折线图可以让数据点依次显示,使得整个图表不再死板,像变 了一样!在开始之前,需要先介…