Spring框架核心技術深度解析:JDBC模板、模擬轉賬與事務管理

一、JDBC模板技術:簡化數據庫操作

在傳統JDBC開發中,繁瑣的資源管理和重復代碼一直是開發者的痛點。Spring框架提供的 JDBC模板(JdbcTemplate) 徹底改變了這一現狀,它通過封裝底層JDBC操作,讓開發者僅需關注SQL邏輯,大幅提升開發效率。

1.1 快速入門:從手動編碼到Spring管理

手動創建模板對象

@Test
public void run1() {// 配置數據庫連接池DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setUsername("root");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setPassword("root");// 創建JdbcTemplate并執行SQLJdbcTemplate template = new JdbcTemplate(dataSource);template.update("insert into account values (null,?,?)", "熊大", 1000);
}

Spring管理模板對象

通過配置文件將數據源和模板納入IOC容器管理,避免硬編碼:

<!-- 配置數據源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql:///spring_db" /><property name="username" value="root" /><property name="password" value="root" />
</bean><!-- 配置JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource" />
</bean>

1.2 進階用法:操作數據庫的增刪改查

執行更新操作(增、刪、改)

// 新增數據
jdbcTemplate.update("insert into account values (null,?,?)", "熊二", 500);
// 修改數據
jdbcTemplate.update("update account set name = ?,money = ? where id = ?", "光頭強", 100, 7);
// 刪除數據
jdbcTemplate.update("delete from account where id = ?", 7);

查詢操作:結果集映射

通過RowMapper接口實現自定義數據封裝,例如將查詢結果映射為Account對象:

// 單個對象查詢
Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new BeanMapper(), // 自定義RowMapper實現類6
);// 列表查詢
List<Account> list = jdbcTemplate.query("select * from account", new BeanMapper()
);class BeanMapper implements RowMapper<Account> {@Overridepublic Account mapRow(ResultSet rs, int rowNum) throws SQLException {Account account = new Account();account.setId(rs.getInt("id"));account.setName(rs.getString("name"));account.setMoney(rs.getDouble("money"));return account;}
}

1.3 集成開源連接池:以Druid為例

替換為高性能的Druid連接池只需兩步:

  1. 添加Maven依賴:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>
  1. 修改配置文件:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" />
</bean>

同時建議將數據庫配置提取到jdbc.properties文件,通過<context:property-placeholder>標簽加載,提升配置靈活性。

二、模擬轉賬開發:業務邏輯與事務需求

轉賬場景是檢驗數據庫操作和事務管理的典型場景,涉及扣減余額增加余額兩個核心步驟,必須保證原子性——要么全部成功,要么全部回滾。

2.1 業務層與持久層設計

服務接口定義

public interface AccountService {void pay(String out, String in, double money); // 轉賬方法
}

持久層實現(基于JdbcTemplate)

public class AccountDaoImpl implements AccountDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 付款:扣減余額@Overridepublic void outMoney(String out, double money) {jdbcTemplate.update("update account set money = money - ? where name = ?", money, out);}// 收款:增加余額@Overridepublic void inMoney(String in, double money) {jdbcTemplate.update("update account set money = money + ? where name = ?", money, in);}
}

服務層實現

public class AccountServiceImpl implements AccountService {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}@Overridepublic void pay(String out, String in, double money) {accountDao.outMoney(out, money); // 扣錢accountDao.inMoney(in, money); // 加錢}
}

2.2 未加事務的問題:數據不一致風險

若轉賬過程中(如扣錢后)發生異常(如服務器崩潰),會導致付款方余額已扣減但收款方未到賬,破壞數據一致性。例如:

@Override
public void pay(String out, String in, double money) {accountDao.outMoney(out, money); // 成功執行int a = 1/0; // 模擬異常accountDao.inMoney(in, money); // 未執行
}

此時需要事務管理來保障操作的原子性。

三、Spring事務管理:聲明式與注解式實現

Spring提供了兩種事務管理方式:編程式事務(手動編寫事務代碼)和聲明式事務(推薦,通過配置或注解管理)。

3.1 聲明式事務:基于XML配置

步驟1:配置事務管理器

<!-- 平臺事務管理器,基于數據源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>

步驟2:定義事務通知

<!-- 事務通知:指定哪些方法需要事務增強 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- pay方法配置:默認隔離級別, REQUIRED傳播行為 --><tx:method name="pay" isolation="DEFAULT" propagation="REQUIRED" /><!-- 所有find開頭的方法設為只讀 --><tx:method name="find*" read-only="true" /></tx:attributes>
</tx:advice>

步驟3:AOP織入事務

<aop:config><!-- 將事務通知應用到指定切入點 --><aop:advisor advice-ref="txAdvice" pointcut="execution(public * com.qcbyjy.*.AccountServiceImpl.pay(..))" />
</aop:config>

3.2 注解式事務:更簡潔的開發體驗

步驟1:開啟事務注解支持

在配置文件中添加:

<tx:annotation-driven transaction-manager="transactionManager" />

步驟2:在服務方法上添加@Transactional注解

@Service
@Transactional // 類級注解:對所有方法啟用事務
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Overridepublic void pay(String out, String in, double money) {accountDao.outMoney(out, money); int a = 1/0; // 異常會觸發事務回滾accountDao.inMoney(in, money);}
}
  • @Transactional可作用于類或方法,推薦作用于方法以精準控制。
  • 關鍵屬性:
    • isolation:隔離級別(如Isolation.REPEATABLE_READ)。
    • propagation:傳播行為(如Propagation.REQUIRED,默認值)。
    • rollbackFor:指定需要回滾的異常類型。

3.3 純注解配置:全Java代碼管理

通過@Configuration類替代XML配置,實現完全注解化開發:

@Configuration
@ComponentScan(basePackages="com.qcbyjy.demo6")
@EnableTransactionManagement // 開啟事務注解
public class SpringConfig {@Bean(name="dataSource")public DataSource createDataSource() throws Exception {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}@Bean(name="jdbcTemplate")public JdbcTemplate createJdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}@Bean(name="transactionManager")public PlatformTransactionManager createTransactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

四、核心總結:三大模塊的協同作用

模塊作用描述
JDBC模板封裝JDBC操作,簡化數據庫訪問,支持連接池和結果集映射。
模擬轉賬業務體現事務的必要性,通過扣減/增加余額的原子性需求,引出事務管理的核心價值。
聲明式事務基于AOP實現非侵入式事務管理,通過配置或注解靈活控制事務范圍和行為。

通過這三大模塊的結合,Spring框架實現了高效的數據訪問安全的業務邏輯便捷的事務控制,成為企業級開發中不可或缺的核心技術。開發者只需專注業務邏輯,底層的資源管理和事務保障由框架自動完成,極大提升了開發效率和系統穩定性。

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

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

相關文章

Modern C++(一)基本概念

1、基本概念 1.1、注釋 注釋在翻譯階段3會被替換為單個空白字符從程序中移除 1.2、名字與標識符 標識符是一個由數字、下劃線、大小寫字符組成的任意長度序列。有效的標識符首個字符必須是以A-Z、a-z、下劃線開頭&#xff0c;。有效的標識符其他字符可以是0-9、A-Z、a-z、下…

STM32的TIMx中Prescaler和ClockDivision的區別

Prescaler預分頻&#xff0c;以筆者目前的學習程度來說&#xff0c;這個參數&#xff0c;一般來說是對主時鐘進行分頻后的計數器時鐘。這個預分頻后的時鐘主要是用于的計數的。 這個主時鐘&#xff0c;對于時基單元來說可以是內部時鐘&#xff0c;也可以是外部時鐘。一般來說我…

前端性能指標及優化策略——從加載、渲染和交互階段分別解讀詳解并以Webpack+Vue項目為例進行解讀

按照加載階段、渲染階段和交互階段三個維度進行系統性闡述&#xff1a; 在現代 Web 開發中&#xff0c;性能不再是錦上添花&#xff0c;而是決定用戶體驗與業務成敗的關鍵因素。為了全面監控與優化網頁性能&#xff0c;我們可以將性能指標劃分為加載階段、渲染階段、和交互階段…

MySQL——1、數據庫基礎

數據庫基礎 1、安裝MySQL2、什么是數據庫3、數據庫使用案例4、MySQL架構與SQL分類5、存儲引擎 1、安裝MySQL 1、更新軟件包列表 sudo apt update2、查看MySQL安裝包 apt list | grep mysql-server3、安裝MySQL # 默認安裝最新版 sudo apt install -y mysql-server4、啟動My…

ET MailBoxComponent類(實體) 分析

MailBoxComponent 作用是&#xff0c;用來接收Actor消息&#xff0c;處理Actor消息。這個沒有存儲能&#xff0c;收到消息后立即就處理了。ParentInstanceId 是MailBox所在的實體InstanceIdMailBoxType MailBox類型MailBoxInvoker 分發消息的包裝Add 方法&#xff0c;看名字是…

Weblogic SSRF漏洞復現(CVE-2014-4210)【vulhub靶場】

漏洞概述&#xff1a; Weblogic中存在一個SSRF漏洞&#xff0c;利用該漏洞可以發送任意HTTP請求&#xff0c;進而攻擊內網中redis、fastcgi等脆弱組件。 漏洞形成原因&#xff1a; WebLogic Server 的 UDDI 組件&#xff08;uddiexplorer.war&#xff09;中的 SearchPublicR…

js應用opencv

思路&#xff1a; 第一步&#xff1a;直方圖 第二步&#xff1a;獲得直方圖的波峰 第三步&#xff1a;波峰勝負10&#xff0c;高于或低于變紅色 1.引用import cv from ‘techstark/opencv-js’; 2.vue代碼 <div class"historyLeft2"><div style"relat…

用Python代碼繪制動態3D愛心效果

引言 介紹Python在創意編程中的應用&#xff0c;特別是如何通過簡單的代碼實現視覺上的美感。引出本文將分享的愛心代碼&#xff0c;并簡要說明其實現原理。 愛心代碼的基本實現 展示一個簡單的Python代碼示例&#xff0c;使用字符畫的方式在控制臺中繪制一個愛心圖案。 pr…

使用Python開發經典俄羅斯方塊游戲

使用Python開發經典俄羅斯方塊游戲 在這篇教程中&#xff0c;我們將學習如何使用Python和Pygame庫開發一個經典的俄羅斯方塊游戲。這個項目將幫助你理解游戲開發的基本概念&#xff0c;包括圖形界面、用戶輸入處理、碰撞檢測等重要內容。 項目概述 我們將實現以下功能&…

兼顧長、短視頻任務的無人機具身理解!AirVista-II:面向動態場景語義理解的無人機具身智能體系統

作者&#xff1a;Fei Lin 1 ^{1} 1, Yonglin Tian 2 ^{2} 2, Tengchao Zhang 1 ^{1} 1, Jun Huang 1 ^{1} 1, Sangtian Guan 1 ^{1} 1, and Fei-Yue Wang 2 , 1 ^{2,1} 2,1單位&#xff1a; 1 ^{1} 1澳門科技大學創新工程學院工程科學系&#xff0c; 2 ^{2} 2中科院自動化研究所…

【藍橋杯省賽真題49】python偶數 第十五屆藍橋杯青少組Python編程省賽真題解析

python偶數 第十五屆藍橋杯青少組python比賽省賽真題詳細解析 博主推薦 所有考級比賽學習相關資料合集【推薦收藏】1、Python比賽 信息素養大賽Python編程挑戰賽 藍橋杯python選拔賽真題詳解

鴻蒙(HarmonyOS)應用開發入門教程

目錄 第一章:鴻蒙系統簡介 1.1 什么是鴻蒙系統? 1.2 鴻蒙系統架構 第二章:開發環境搭建 2.1 安裝DevEco Studio 步驟1:下載與安裝 步驟2:首次配置 步驟3:設備準備 2.2 創建第一個項目 第三章:鴻蒙應用開發基礎 3.1 核心概念:Ability與AbilitySlice 示例代碼…

VM中 ubuntu 網卡不顯示

1.添加網卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看網絡狀態 sudo systemctl start systemd-networkd sudo systemctl status sy…

阿克曼-幻宇機器人系列教程3- 機器人交互實踐(Message)

上一篇文章介紹了如何通過topic操作命令實現與機器人的交互&#xff0c;本篇我們介紹如何通過Message&#xff08;即topic的下一級&#xff09;實現與機器人的交互。 和topic一樣&#xff0c;首先在一個終端通過ssh命令登錄機器人、啟動機器人&#xff0c;然后打開另外一個終端…

Python 調試擴展版本兼容問題解決紀實

在 Python 開發中&#xff0c;調試工具的正常使用對效率至關重要。近期在公司項目中&#xff0c;便遇到了 Python 調試擴展與版本不兼容的問題。公司 ERP 服務器采用 Ubuntu 18.04 系統&#xff0c;其標配 Python 版本為 3.6&#xff0c;而常用的 Python Debugger 擴展對版本有…

React 第四十二節 Router 中useLoaderData的用途詳解

一、前言 useLoaderData&#xff0c;用于在組件中獲取路由預加載的數據。它通常與路由配置中的 loader 函數配合使用&#xff0c;用于在頁面渲染前異步獲取數據&#xff08;如 API 請求&#xff09;&#xff0c;并將數據直接注入組件&#xff0c;從而簡化數據流管理。 二、us…

Linux——mysql主從復制與讀寫分離

目錄 一&#xff0c;理解什么是mysql主從復制 1&#xff0c;mysql支持的復制類型 2&#xff0c;mysql主從復制的工作流程 二&#xff0c;配置mysql主從復制 三&#xff0c;配置mysql主主復制 四&#xff0c;mysql讀寫分離 1&#xff0c;了解什么是mysql讀寫分離 2&…

MongoDB數據庫深度解析:架構、特性與應用場景

在現代應用程序開發中&#xff0c;數據存儲技術的選擇至關重要。在眾多的數據庫管理系統中&#xff0c;MongoDB以其靈活性和強大的功能迅速崛起&#xff0c;成為NoSQL數據庫中的佼佼者。本文將深入解析MongoDB的架構、核心特性、性能優化及其在實際應用中的最佳實踐&#xff0c…

3D曲面上的TSP問題(一):曲面上點集距離求解

3D曲面上&#xff0c;兩點的距離求解不能采用歐式距離&#xff0c;而需要計算測地線距離。 代碼使用CGAL 5.6.2 OpenCV 4.11.0 版本實現 #include "cgal_utils.h" #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_…

【歌曲結構】2:小節與歌曲結構信息整合

歌曲小節與結構信息整合 我將為您整合小節信息與歌曲結構,創建一個更加詳細的JSON數據結構。 處理方法 將小節時間與歌曲結構段落進行匹配為每個小節添加所屬段落信息為小節添加格式化的時間戳為小節添加對應時間范圍內的歌詞{"song_title": "財神廟前許三億…