Spring Boot中JdbcTemplate多數據源配置

作者簡介:大家好,我是擼代碼的羊駝,前阿里巴巴架構師,現某互聯網公司CTO

聯系v:sulny_ann(17362204968),加我進群,大家一起學習,一起進步,一起對抗互聯網寒冬


在《Spring Boot中JdbcTemplate源碼分析》中講到了自動配置相關的源代碼實現。基于Spring Boot自動配置默認配置的組件,我們可以來自定義JdbcTemplate的實例化。而多數據源的配置就是在此基礎上實例化多個數據源和JdbcTemplate。

下面,我們來看具體的源代碼實現。

依賴類庫

關于依賴類庫與集成JdbcTemplate時的一樣,Spring Boot版本2.2.2.RELEASE。

相關pom依賴如下:

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>
    <!--數據庫連接相關-->    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-jdbc</artifactId>    </dependency>    <dependency>        <groupId>mysql</groupId>        <artifactId>mysql-connector-java</artifactId>    </dependency>
    <dependency>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>        <optional>true</optional>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-test</artifactId>        <scope>test</scope>        <exclusions>            <exclusion>                <groupId>org.junit.vintage</groupId>                <artifactId>junit-vintage-engine</artifactId>            </exclusion>        </exclusions>    </dependency></dependencies>

spring-boot-starter-jdbc是集成jdbc的依賴,mysql-connector-java是基于mysql的依賴類庫。lombok是簡化代碼的工具類,如果不需要可去掉,并去掉類中相關的注解。

spring-boot-starter-test為單元測試依賴的類庫,這里單元測試使用的是junit5,注意使用方法與junit4差別比較大。

配置application

application.properties配置如下:???????

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/spring?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=truespring.datasource.primary.username=rootspring.datasource.primary.password=root_123spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/spring1?serverTimezone=UTC&useUnicode=true\  &characterEncoding=utf-8&useSSL=truespring.datasource.secondary.username=rootspring.datasource.secondary.password=root_123spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

既然是多數據源,肯定要配置多個數據源的配置。與單數據源配置基本形式差不多。

需要注意的是第一個配置項的key為:spring.datasource.primary.jdbc-url。與單數據源時使用的spring.datasource.url有所區別。不然,啟動時會拋出異常。

多數據源對應的Java配置

下面就需要我們自己來實例化DataSource和JdbcTemplate。相關的實例化也可參看源碼解析文章中Spring Boot的實例化方式。

這里,我們的實現如下:???????

@Configurationpublic class DataSourceConfig {
  @Primary  @Bean(name = "primaryDataSource")  @ConfigurationProperties(prefix="spring.datasource.primary")  public DataSource primaryDataSource() {    return DataSourceBuilder.create().build();  }
  @Bean(name = "secondaryDataSource")  @ConfigurationProperties(prefix="spring.datasource.secondary")  public DataSource secondaryDataSource() {    return DataSourceBuilder.create().build();  }
  @Bean(name="primaryJdbcTemplate")  public JdbcTemplate primaryJdbcTemplate (@Qualifier("primaryDataSource")  DataSource dataSource ) {    return new JdbcTemplate(dataSource);  }
  @Bean(name="secondaryJdbcTemplate")  public JdbcTemplate  secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {    return new JdbcTemplate(dataSource);  }
}

@Configuration聲明該類為配置類。

@Primary指定當出現多個相同類型的實例化對象時,以該注解標注的為默認的。

@Bean實例化Bean,并將其注入到容器當中。這里分別實例化了primaryDataSource和secondaryDataSource兩個DataSource,以Bean的名稱來區分。

@ConfigurationProperties將前綴為spring.datasource.primary和前綴為spring.datasource.secondary的配置屬性設置到對應的DataSource中。

隨后實例化了兩個JdbcTemplate,直接通過new關鍵字創建,并且把對應的DataSource作為構造參數傳入。

經過該配置文件的配置,便有了兩個JdbcTemplate。

實體類

實體類如下:???????

@Datapublic class Order {
  private int id;
  private String orderNo;
  private int amount;}

@Data為Lombok的注解,自動生成一些默認的方法,比如屬性的getter/setter方法。

數據庫

關于數據庫的DDL如下:???????

CREATE TABLE `tb_order` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `amount` int(11) NOT NULL DEFAULT '1',  `order_no` varchar(64) NOT NULL DEFAULT '',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

同樣的表在兩個數據庫中進行創建。

接口定義

定義OrderService接口:???????

public interface OrderService {
  /**   * 創建訂單   * @param order 訂單信息   * @return 記錄數   */  int save(Order order);
  /**   * 保存到指定庫   * @param order 訂單信息   * @param jdbcTemplate jdbc   * @return   */  int save(Order order, JdbcTemplate jdbcTemplate);}

接口實現:???????

@Service("orderService")public class OrderServiceImpl implements OrderService {
  @Resource  @Qualifier("primaryJdbcTemplate")  private JdbcTemplate jdbcTemplate;
  @Override  public int save(Order order) {    return jdbcTemplate.update("insert into tb_order(order_no, amount) values(?, ?)", order.getOrderNo(),        order.getAmount());  }
  @Override  public int save(Order order, JdbcTemplate secJdbcTemplate) {    if (secJdbcTemplate != null) {      return secJdbcTemplate.update("insert into tb_order(order_no, amount) values(?, ?)", order.getOrderNo(),          order.getAmount());    } else {      return jdbcTemplate.update("insert into tb_order(order_no, amount) values(?, ?)", order.getOrderNo(),          order.getAmount());    }  }}

在實現方法中,默認注入了主庫的JdbcTemplate,同時在原來的save方法中新增了一個JdbcTemplate參數,可以根據是否傳遞該新的JdbcTemplate來決定使用哪個JdbcTemplate。

當然在此方法內也可以使用一個JdbcTemplate,然后根據參數動態的修改該JdbcTemplate指向的具體實現類。可以根據具體情況進行靈活運用。

單元測試

單元測試類如下:

@Slf4j@SpringBootTestclass OrderServiceTest {
  @Resource  private OrderService orderService;
  @Resource  @Qualifier("primaryJdbcTemplate")  private JdbcTemplate primaryJdbcTemplate;
  @Resource  @Qualifier("secondaryJdbcTemplate")  private JdbcTemplate secondaryJdbcTemplate;
  @Test  void save() {    Order order = new Order();    order.setOrderNo("N003");    order.setAmount(10000);    orderService.save(order, primaryJdbcTemplate);    orderService.save(order, secondaryJdbcTemplate);  }}

執行以上單元測試,兩個庫中的tb_order表分別插入了一條數據。關于其他增刪改查操作,可參考保存方法進行擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214872.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編譯 Flink代碼

構建環境 JDK1.8以上和Maven 3.3.x可以構建Flink&#xff0c;但是不能正確地遮蓋某些依賴項。Maven 3.2.5會正確創建庫。所以這里使用為了減少問題選擇 Maven3.2.5版本進行構建。要構建單元測試&#xff0c;請使用Java 8以上&#xff0c;以防止使用PowerMock運行器的單元測試失…

云計算核心技術

1.1 云計算的定義 云計算是目前業內的熱點概念&#xff0c;它以開放的標準和服務為基礎&#xff0c;以互聯網為中心&#xff0c;提供安全、快速、便捷的數據存儲和網絡計算服務&#xff0c;讓互聯網這片“云”上的各種計算機共同組成數個龐大的數據中心及計算中心。它可以被看成…

求職智能分析系統

本項目是一個基于Flask輕量級框架的計算機就業數據可視化分析平臺。 采用echarts和ajax等技術進行數據展示和用戶交互。

【電路筆記】-電位器

電位器 文章目錄 電位器1、概述2、電位器類型2.1 旋轉電位器2.2 滑塊電位器2.3 預設和微調電位器2.4 變阻器 3、電位器示例14、電位器作為分壓器5、電位器示例26、變阻器6、滑塊變阻器7、線性或對數電位器8、總結 當連接的軸物理旋轉時&#xff0c;電位計和變阻器的電阻值會發生…

一個簡單的Wireshark和TCP三次握手,為什么能難住阿里6年測試?

之前寫過一篇博客&#xff1a;用 Fiddler 來調試HTTP&#xff0c;HTTPS。 這篇文章介紹另一個好用的抓包工具wireshark&#xff0c; 用來獲取網絡數據封包&#xff0c;包括http,TCP,UDP&#xff0c;等網絡協議包。 記得大學的時候就學習過TCP的三次握手協議&#xff0c;那時候…

Vue中 v-show 和 v-if 有什么區別

Vue中的 v-show 和 v-if 一.v-show 與 v-if 原理分析v-show 原理v-if 原理 二、v-show 與 v-if 的共同點三、v-show 與 v-if 的區別四、v-show 與 v-if 的使用場景使用 v-show 的場景&#xff1a;使用 v-if 的場景&#xff1a; 五、v-show 與 v-if 的優缺點v-show優點&#xff…

kafka rebalance(再均衡)導致的消息積壓分析

起因&#xff1a; 某天&#xff0c;項目組收到大量的kafka消息積壓告警。查看了kafka日志后&#xff0c;發現 kafka不斷地 rebalance(再均衡)。 Rebalance (再均衡)&#xff1a; 分區的所有權從一個消費者轉移到另一個消費者&#xff0c;這樣的行為被稱為Rebalance (再均衡)…

修改汽車的控制系統實現自動駕駛,基于一個開源的汽車駕駛輔助系統實現全自動駕駛

修改汽車的控制系統實現自動駕駛,基于一個開源的汽車駕駛輔助系統實現全自動駕駛。 自動駕駛汽車依靠人工智能、視覺計算、雷達、監控裝置和全球定位系統協同合作,讓電腦可以在沒有任何人類主動的操作下,自動安全地操作機動車輛。 演示視頻: Openpilot :一個開源的汽車駕…

Socks5代理與代理IP的技術創新

隨著全球市場的開放和跨界電商的崛起&#xff0c;企業在出海過程中面臨著復雜多變的網絡環境和地域限制。在這一背景下&#xff0c;Socks5代理和代理IP等技術應運而生&#xff0c;成為助力企業突破網絡壁壘、實現出海目標的重要工具。本文將深入探討Socks5代理和代理IP在跨界電…

OpenSSL 3.x爆出漏洞,如何妥善應對?

10月25日&#xff0c;OpenSSL項目團隊發布了OpenSSL 3.x版中一個關鍵安全漏洞的修復程序。該修復程序已于11月1日正式發布。 由于OpenSSL有著極為廣泛的使用&#xff0c;該公告引起了很大反響。Akamai希望能通過本文幫助相關用戶了解情況&#xff0c;介紹有關檢測和緩解威脅的…

怎么消除視頻中所有的聲音?方法很簡單

當我們想把視頻中去掉聲音&#xff0c;可能有多種原因&#xff0c;也許需要制作一個無聲視頻&#xff0c;或者想在視頻中添加自己的音樂或解說&#xff0c;特別是一些搞笑解說&#xff0c;無論原因是什么&#xff0c;到底要怎么把視頻中所有的聲音都去除呢&#xff1f; 小編給…

計算機畢業設計 基于Web的網上購物系統(pc端仿淘寶系統)的設計與實現 Java實戰項目 附源碼+文檔+視頻講解

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精…

SVN優缺點詳解及版本控制系統選型建議

Subversion (SVN)是目前可用的眾多版本控制選項之一。本篇文章將全面概述什么是 SVN、SVN的歷史、SVN存儲庫是什么&#xff0c;以及在切換到SVN之前您應該謹慎考慮的潛在問題。 什么是Subversion&#xff08;SVN&#xff09;&#xff1f; Subversion軟件&#xff0c;也稱為SV…

管理類聯考——數學——真題篇——按知識分類——代數

文章目錄 2023真題(2023-09)-代數-一元二次方程-注意絕對值的有效性真題(2023-17)-代數-一元二次方程-舉反例真題(2023-18)-數列-等比數列真題(2023-24)-數列-等比數列2022真題(2022-03)-代數-整式-因式分解真題(2022-19)-數列-等比數列真題(2022-21)-數列-等比數…

Docker的常用命令(沒有廢話)

目錄 鏡像 鏡像管理命令 鏡像構建命令 鏡像標簽和推送命令 其他命令 容器 運行容器 停止和刪除容器 查看容器信息 進入容器 數據卷 列出卷 創建和刪除卷 將卷掛載到容器 鏡像 鏡像管理命令 docker images # 列出本地所有的鏡像 docker search <關鍵詞> #…

使用pe安裝windows操作系統

一、系統安裝前準備工作&#xff0c;制作系統盤 &#xff08;1&#xff09;拷貝電腦上的資料 &#xff08;2&#xff09;準備一個至少8G的U盤 &#xff08;3&#xff09;下載windows鏡像文件及pe軟件 通過百度網盤可下載下列軟件及鏡像 windows鏡像文件&#xff08;百度網盤…

知識筆記(五十二)———MySQL 安裝

Linux/UNIX 上安裝 MySQL Linux平臺上推薦使用RPM包來安裝Mysql,MySQL AB提供了以下RPM包的下載地址&#xff1a; MySQL - MySQL服務器。你需要該選項&#xff0c;除非你只想連接運行在另一臺機器上的MySQL服務器。MySQL-client - MySQL 客戶端程序&#xff0c;用于連接并操作…

Kotlin 中的 `as` 關鍵字:類型轉換的藝術

在 Android 編程中&#xff0c;類型轉換是一項常見的操作。為了使這一過程更加流暢和安全&#xff0c;Kotlin 提供了 as 關鍵字。本文將深入探討 as 關鍵字的用法和最佳實踐。 一、as 關鍵字的基本概念 &#x1f680; as 關鍵字在 Kotlin 中用于顯式類型轉換。它將一個表達式…

vue零基礎

vue 與其他框架的對比 框架設計模式數據綁定靈活度文件模式復雜性學習曲線生態VueMVVM雙向靈活單文件小緩完善ReactMVC單向較靈活all in js大陡豐富AngularMVC雙向固定多文件較大較陡&#xff08;Typescript&#xff09;獨立 更多對比細節&#xff1a;vue 官網&#xff1a;ht…

matplotlib繪圖時show函數需在save函數后

matplotlib繪圖時&#xff0c;先調用show&#xff0c;后調用save函數保存圖像&#xff0c;否則無法保存圖像信息 figsize 23,10 #fig, axes plt.subplots(nrows1, ncols2) fig, axs plt.subplots(4, 3, sharexcol,shareyrow,figsizefigsize) # 在每個子圖中繪制一個圖形 pi…