Spring 核心技術解析【純干貨版】- IX:Spring 數據訪問模塊 Spring-Jdbc 模塊精講

在現代企業級應用中,數據訪問層的穩定性和高效性至關重要。為了簡化和優化數據庫操作,Spring Framework 提供了 Spring-JDBC 模塊,旨在通過高度封裝的 JDBC 操作,簡化開發者的編碼負擔,減少冗余代碼,同時提升系統的健壯性和可維護性。Spring-JDBC 模塊的核心組成之一,JdbcTemplate,是開發者在數據庫交互中最常用的工具,它不僅大幅度減少了樣板代碼,還自動處理了事務和異常管理。本文將深入探討 Spring-JDBC 模塊的基本功能、核心組件以及事務管理機制,幫助開發者更好地理解和使用該模塊,從而提升數據訪問的效率與安全性。


文章目錄

      • 1、Spring-Jdbc 模塊介紹
        • 1.1、Spring-Jdbc 模塊概述
        • 1.2、Spring-Jdbc 模塊依賴
        • 1.3、Spring-Jdbc 模塊作用
      • 2、Spring-Jdbc 核心組件
        • 2.1、配置文件和依賴
        • 2.2、配置 Spring 容器
        • 2.3、啟動 Spring 容器
        • 2.4、使用 `EmpDao` 類中的方法
      • 3、Spring-Jdbc 事務管理
        • 3.1、Spring JDBC 事務管理概述
        • 3.2、使用 `@Transactional` 進行聲明式事務管理
        • 3.3、編程式事務管理
        • 3.4、事務傳播行為
      • X、后記


1、Spring-Jdbc 模塊介紹

1.1、Spring-Jdbc 模塊概述

Spring JDBC 模塊,是一個提供了對 JDBC 訪問的高度抽象的模塊,它簡化了使用 JDBC 進行數據庫操作的過程。

Spring JDBC 模塊,它包含了一個 JdbcTemplate 類,該類封裝了諸如查詢、更新、事務處理等常用操作,使得編寫數據庫交互代碼變得更加簡潔且不易出錯。JdbcTemplate 還能自動處理資源管理和異常翻譯,提高了代碼的健壯性。

1.2、Spring-Jdbc 模塊依賴

Spring-Jdbc 模塊的依賴有三個,分別是 Spring-Beans 模塊、Spring-Core 模塊和 Spring-Tx 模塊。

其中 Spring Beans 模塊是對 Spring Bean 進行定義,實現 IOC 基礎功能的模塊。Spring-Core 是 Spring 中的基礎模塊,它提供了框架運行所必需的核心功能。而 Spring Tx 模塊,是 Spring 中處理事務管理的模塊。

1.3、Spring-Jdbc 模塊作用

Spring-JDBC 的主要作用:

  1. 簡化 JDBC 操作:Spring-JDBC 提供了 JdbcTemplate 類,封裝了 JDBC 的核心操作(如連接管理、SQL 執行、結果集處理等),開發者只需關注 SQL 語句和業務邏輯,無需手動處理資源管理(如關閉連接、結果集等)。
  2. 減少樣板代碼:傳統的 JDBC 代碼需要手動處理 ConnectionStatementResultSet 等資源的創建和釋放,容易出錯且代碼冗長。Spring-JDBC 通過模板方法模式,自動處理這些資源,減少了重復代碼。
  3. 異常處理:Spring-JDBC 將 JDBC 的 SQLException 轉換為 Spring 的 DataAccessException 異常體系,提供了更清晰的異常層次結構,便于開發者處理數據庫操作中的錯誤。
  4. 事務管理:Spring-JDBC 與 Spring 的事務管理模塊無縫集成,支持聲明式事務管理(通過注解或 XML 配置),簡化了事務控制的實現。
  5. 支持多種數據庫操作:除了基本的 CRUD 操作,Spring-JDBC 還支持批量操作、存儲過程調用、復雜結果集映射等功能。
  6. 與 ORM 框架集成:Spring-JDBC 可以與其他 ORM 框架(如 Hibernate、MyBatis)結合使用,提供更靈活的數據訪問方式。

2、Spring-Jdbc 核心組件

JdbcTemplate 為 Spring JDBC 的核心類,提供數據 CRUD 方法。本節介紹對于 JdbcTemplate 的使用。

2.1、配置文件和依賴

使用 Maven,確保在 pom.xml 中正確引入了相關的 Spring JDBC 和數據庫連接池的依賴。例如:

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.39</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.39</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies>
2.2、配置 Spring 容器

首先,確保我們的 Spring 配置文件配置正確,并且已經引入了 Spring 的上下文和 JDBC 配置。例如:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置數據源 --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/yourdb"/><property name="username" value="yourusername"/><property name="password" value="yourpassword"/></bean><!-- 配置JdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><!-- 配置EmpDao --><bean id="empDao" class="com.example.EmpDao"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean>
</beans>
2.3、啟動 Spring 容器

在 Spring 項目中,通常使用 ClassPathXmlApplicationContext 來加載配置文件并啟動容器。我們可以在 main 方法中使用如下代碼啟動 Spring 容器:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {// 加載 Spring 配置文件ApplicationContext context = new ClassPathXmlApplicationContext("spring-bean.xml");// 獲取 EmpDao Bean 并調用方法EmpDao empDao = (EmpDao) context.getBean("empDao");// 調用 EmpDao 中的方法empDao.addEmployee("John Doe", 30);empDao.deleteEmployee(5);}
}
2.4、使用 EmpDao 類中的方法

確保我們的 EmpDao 類已經正確配置了增刪改查的方法,并且使用了 JdbcTemplate。例如:

import org.springframework.jdbc.core.JdbcTemplate;public class EmpDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void addEmployee(String name, int age) {String sql = "INSERT INTO employee (name, age) VALUES (?, ?)";jdbcTemplate.update(sql, name, age);}public void deleteEmployee(int id) {String sql = "DELETE FROM employee WHERE id = ?";jdbcTemplate.update(sql, id);}
}

3、Spring-Jdbc 事務管理

Spring JDBC 提供了對事務管理的支持,使得數據庫操作的事務管理更加簡潔和統一。通過 Spring 的事務管理,我們可以在操作數據庫時保證事務的一致性和原子性,避免數據的不一致性。

Spring 提供了兩種事務管理機制:

  1. 編程式事務管理:通過代碼顯式地控制事務的開始、提交、回滾。
  2. 聲明式事務管理:通過配置和注解(@Transactional)來實現自動的事務管理,Spring 會自動控制事務的開始、提交、回滾。
3.1、Spring JDBC 事務管理概述

Spring 提供了 DataSourceTransactionManager 來管理 JDBC 事務,它實現了 PlatformTransactionManager 接口,Spring 會通過該類來控制事務的生命周期。

  • 事務的狀態:通常有 begin(開始)、commit(提交)、rollback(回滾)。
  • 傳播行為:事務的傳播方式,決定了一個方法被調用時,當前事務的狀態。
3.2、使用 @Transactional 進行聲明式事務管理

最常用的方式是通過 @Transactional 注解實現聲明式事務管理。Spring 會在方法執行前開啟事務,執行完畢后提交事務。如果出現異常,事務會回滾。

例子:使用 @Transactional 注解

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;public class EmpDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 使用 @Transactional 注解,聲明式事務管理@Transactionalpublic void addEmployeeAndDepartment(String empName, int empAge, String deptName) {String addEmployeeSql = "INSERT INTO employee (name, age) VALUES (?, ?)";jdbcTemplate.update(addEmployeeSql, empName, empAge);String addDepartmentSql = "INSERT INTO department (name) VALUES (?)";jdbcTemplate.update(addDepartmentSql, deptName);// 模擬一個錯誤,事務應該回滾if (empAge < 0) {throw new RuntimeException("Invalid age");}}
}

在上面的例子中:

  • @Transactional 注解表示在 addEmployeeAndDepartment 方法執行時,Spring 會自動管理事務。
  • 如果方法正常執行,事務會提交。
  • 如果方法拋出異常,Spring 會自動回滾事務。

配置支持事務管理:

為了讓 Spring 管理事務,我們需要在配置文件中啟用事務管理器,并且確保 Spring 容器掃描事務管理相關注解。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 配置事務管理器 --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/yourdb"/><property name="username" value="yourusername"/><property name="password" value="yourpassword"/></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 開啟事務管理 --><tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
3.3、編程式事務管理

如果不想使用聲明式事務,可以使用編程式事務管理。在這種方式中,我們需要顯式地使用 PlatformTransactionManager 來控制事務。

例子:編程式事務管理

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;public class EmpDao {private JdbcTemplate jdbcTemplate;private PlatformTransactionManager transactionManager;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void setTransactionManager(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;}public void addEmployeeAndDepartment(String empName, int empAge, String deptName) {// 創建事務定義DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status = transactionManager.getTransaction(def);try {String addEmployeeSql = "INSERT INTO employee (name, age) VALUES (?, ?)";jdbcTemplate.update(addEmployeeSql, empName, empAge);String addDepartmentSql = "INSERT INTO department (name) VALUES (?)";jdbcTemplate.update(addDepartmentSql, deptName);// 模擬一個錯誤,事務應該回滾if (empAge < 0) {throw new RuntimeException("Invalid age");}// 提交事務transactionManager.commit(status);} catch (Exception e) {// 回滾事務transactionManager.rollback(status);throw e; // 拋出異常}}
}

在編程式事務管理中,我們需要手動創建事務定義(DefaultTransactionDefinition),并使用 PlatformTransactionManager 來開始、提交或回滾事務。

3.4、事務傳播行為

事務的傳播行為決定了事務在多個方法調用之間如何傳播。常見的傳播行為有:

  • PROPAGATION_REQUIRED:如果當前沒有事務,則新建一個事務;如果已有事務,則加入當前事務(默認行為)。
  • PROPAGATION_REQUIRES_NEW:無論當前是否有事務,都會新建一個事務。
  • PROPAGATION_NESTED:支持事務嵌套。如果當前事務存在,則會在當前事務內開啟一個子事務。

我們可以通過設置 @Transactional 注解的 propagation 屬性來控制傳播行為,例如:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addEmployeeAndDepartmentWithNewTransaction(String empName, int empAge, String deptName) {// 新建事務,獨立于外部事務
}

X、后記

通過本文的講解,我們深入了解了 Spring-JDBC 模塊如何通過 JdbcTemplate 類,簡化 JDBC 操作,并自動處理數據庫連接、事務管理和異常翻譯等繁瑣任務。Spring-JDBC 不僅減輕了開發者的工作量,還能顯著提高代碼的可讀性和可維護性。無論是常見的增刪改查操作,還是復雜的事務控制,Spring-JDBC 都提供了極其簡潔和靈活的解決方案。掌握這些核心技術,將為開發者帶來更高效、可靠的數據庫交互體驗。希望大家能將本文中的知識點應用到實際開發中,不斷優化和提升自己的技術水平。

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

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

相關文章

探秘AI的兩大核心:決策式AI與生成式AI?

目錄 一、引言 二、從定義上來看 1. 決策式AI&#xff08;Discriminative AI&#xff09; 2. 生成式AI&#xff08;Generative AI&#xff09; 三、從技術原理上來看 1. 決策式AI&#xff08;Discriminative AI&#xff09; 2. 生成式AI&#xff08;Generative AI&#…

2.5學習

misc buuctf-假如給我三天光明 下載附件后得到了一個壓縮包和一個圖片&#xff0c;壓縮包為加密壓縮包&#xff0c;需要解出密碼&#xff0c;然后注意到這個圖片并非簡單的一個封面&#xff0c;在下方還有諸多點&#xff0c;有黑有灰。經過搜索&#xff0c;發現這是盲文通過與…

sed變量中特殊字符/處理方式

個人博客地址&#xff1a;sed變量中特殊字符/處理方式 | 一張假鈔的真實世界 如果變量值中包含斜杠&#xff08;/&#xff09;特殊字符&#xff0c;在使用sed命令的做行內字符串替換時可以使用井號&#xff08;#&#xff09;做為sed語法分隔符&#xff0c;如下&#xff1a; G…

java進階1——JVM

java進階——JVM 1、JVM概述 作用 Java 虛擬機就是二進制字節碼的運行環境&#xff0c;負責裝載字節碼到其內部&#xff0c;解釋/編譯為對 應平臺上的機器碼指令行&#xff0c;每一條 java 指令&#xff0c;java 虛擬機中都有詳細定義&#xff0c;如怎么取操 作數&#xff0c…

搭建集成開發環境PyCharm

1.下載安裝Python&#xff08;建議下載并安裝3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾選“Add Python 3.9 to PATH”復選框&#xff0c;表示將Python的路徑增加到環境變量中 2.安裝集成開發環境Pycharm http://www.jetbrains.com/pycharm/…

vue2-v-if和v-for的優先級

vue2-v-if和v-for的優先級 1.v-if和v-for的作用 v-if是條件渲染&#xff0c;只有條件表達式true的情況下&#xff0c;才會渲染v-for是基于一個數組來渲染一個列表&#xff0c;在v-for的時候&#xff0c;保證給每個元素添加獨一無二的key值&#xff0c;便于diff算法進行優化 …

通過C/C++編程語言實現“數據結構”課程中的鏈表

引言 鏈表(Linked List)是數據結構中最基礎且最重要的線性存儲結構之一。與數組的連續內存分配不同,鏈表通過指針將分散的內存塊串聯起來,具有動態擴展和高效插入/刪除的特性。本文將以C/C++語言為例,從底層原理到代碼實現,手把手教你構建完整的鏈表結構,并深入探討其應…

《redis4.0 通信模塊源碼分析(一)》

【redis導讀】redis作為一款高性能的內存數據庫&#xff0c;面試服務端開發&#xff0c;redis是繞不開的話題&#xff0c;如果想提升自己的網絡編程的水平和技巧&#xff0c;redis這款優秀的開源軟件是很值得大家去分析和研究的。 筆者從大學畢業一直有分析redis源碼的想法&…

開源安全一站式構建!開啟企業開源治理新篇章

在如今信息技術日新月異、飛速發展的數字化時代&#xff0c;開源技術如同一股強勁的東風&#xff0c;為企業創新注入了源源不斷的活力&#xff0c;然而&#xff0c;正如一枚硬幣有正反兩面&#xff0c;開源技術的廣泛應用亦伴隨著不容忽視的挑戰。安全風險如影隨形&#xff0c;…

DeePseek結合PS!批量處理圖片的方法教程

? ? 今天我們來聊聊如何利用deepseek和Photoshop&#xff08;PS&#xff09;實現圖片的批量處理。 傳統上&#xff0c;批量修改圖片尺寸、分辨率等任務往往需要編寫腳本或手動處理&#xff0c;而現在有了AI的輔助&#xff0c;我們可以輕松生成PS腳本&#xff0c;實現自動化處…

13.代理模式(Proxy Pattern)

定義 代理模式&#xff08;Proxy Pattern&#xff09; 是一種結構型設計模式&#xff0c;它通過提供一個代理對象來控制對目標對象的訪問。代理對象作為客戶端與目標對象之間的中介&#xff0c;間接地訪問目標對象的功能。代理模式可以在不改變目標對象的情況下增加一些額外的…

DBeaver連接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解決方法

在使用DBeaver連接MySQL數據庫時&#xff0c;如果遇到“Access denied for user ip (using password: YES)”的錯誤提示&#xff0c;說明用戶認證失敗。此問題通常與數據庫用戶權限、配置錯誤或網絡設置有關。本文將詳細介紹解決此問題的步驟。 一、檢查用戶名和密碼 首先&am…

Python進行模型優化與調參

在數據科學與機器學習領域,模型的優化與調參是提高模型性能的重要步驟之一。模型優化可以幫助提高模型的準確性和泛化能力,而合理的調參則能夠充分發揮模型的潛力。這篇教程將重點介紹幾種常用的模型優化與調參方法,特別是超參數調整和正則化技術的應用。這些技術能夠有效地…

Verilog基礎(三):過程

過程(Procedures) - Always塊 – 組合邏輯 (Always blocks – Combinational) 由于數字電路是由電線相連的邏輯門組成的,所以任何電路都可以表示為模塊和賦值語句的某種組合. 然而,有時這不是描述電路最方便的方法. 兩種always block是十分有用的: 組合邏輯: always @(…

2024年12月 Scratch 圖形化(一級)真題解析 中國電子學會全國青少年軟件編程等級考試

202412 Scratch 圖形化&#xff08;一級&#xff09;真題解析 中國電子學會全國青少年軟件編程等級考試 一、單選題(共25題&#xff0c;共50分) 第 1 題 點擊下列哪個按鈕&#xff0c;可以將紅框處的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 標…

C++【深入 STL--list 之 迭代器與反向迭代器】

接前面的手撕list(上)文章&#xff0c;由于本人對于list的了解再一次加深。本文再次對list進行深入的分析與實現。旨在再一次梳理思路&#xff0c;修煉代碼內功。 1、list 基礎架構 list底層為雙向帶頭循環鏈表&#xff0c;問題是如何來搭建這個list類。可以進行下面的考慮&am…

如何打開vscode系統用戶全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用戶配置文件&#xff0c;它存儲了 編輯器的個性化設置&#xff0c;包括界面布局、代碼格式化、擴展插件、快捷鍵等&#xff0c;是用戶全局配置&#xff08;影響所有…

wordpress外貿獨立站常用詢盤軟件

LiveChat LiveChat是一家提供實時聊天軟件的公司&#xff0c;幫助企業通過其平臺與客戶進行即時通訊&#xff0c;提高客戶滿意度和忠誠度。他們的產品允許企業在網站、應用程序或電子郵件等多個渠道與客戶互動&#xff0c;從而提升客戶體驗并促進銷售增長。 LiveChat的軟件特…

STM32 ADC模數轉換器

ADC簡介 ADC&#xff08;Analog-Digital Converter&#xff09;模擬-數字轉換器 ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量&#xff0c;建立模擬電路到數字電路的橋梁 12位逐次逼近型ADC&#xff0c;1us轉換時間 輸入電壓范圍&#xff1a;0~3.3V&#xff0…

(2025,LLM,下一 token 預測,擴散微調,L2D,推理增強,可擴展計算)從大語言模型到擴散微調

Large Language Models to Diffusion Finetuning 目錄 1. 概述 2. 研究背景 3. 方法 3.1 用于 LM 微調的高斯擴散 3.2 架構 4. 主要實驗結果 5. 結論 1. 概述 本文提出了一種新的微調方法——LM to Diffusion (L2D)&#xff0c;旨在賦予預訓練的大語言模型&#xff08;…