Spring 框架 JDBC 模板技術詳解

一、JDBC 模板技術概述

在傳統 JDBC 開發中,開發人員需要手動處理數據庫連接(Connection)、事務管理、語句執行(Statement)和結果集(ResultSet)等繁瑣操作,不僅代碼冗余度高,而且容易出錯。Spring 框架針對這一痛點,提供了持久層模板類XxxTemplate)來簡化開發,其中用于 JDBC 操作的核心類是JdbcTemplate

核心優勢

  • 簡化編程:封裝了 JDBC 的底層細節,開發者只需關注 SQL 語句和業務邏輯。
  • 統一接口:提供一致的增刪改查方法,避免重復編寫樣板代碼。
  • 整合連接池:支持 Spring 內置連接池和第三方開源連接池(如 Druid),方便管理數據庫連接。

?二、JDBC 模板類的基礎使用

?1. 創建 Maven 工程并引入依賴

?在pom.xml中添加以下坐標,包含 Spring 核心、JDBC 模塊、數據庫驅動及日志組件:

<dependencies><!-- Spring核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><!-- JDBC模塊 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.2.RELEASE</version></dependency><!-- 數據庫驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!-- 日志 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!-- 測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

?2. 手動創建對象方式(非 Spring 管理)

?通過硬編碼方式創建連接池和JdbcTemplate對象,適用于簡單測試場景:

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;public class Demo1 {@Testpublic void run1() {// 1. 創建Spring內置連接池DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setUsername("root");dataSource.setPassword("root");// 2. 創建JdbcTemplate并綁定連接池JdbcTemplate template = new JdbcTemplate(dataSource);// 3. 執行SQL插入操作template.update("insert into account values(null, ?, ?)", "熊大", 1000);}
}

三、使用 Spring 容器管理 JDBC 組件

?1. Spring 配置文件管理連接池和模板

通過applicationContext_jdbc.xml將連接池和JdbcTemplate納入 Spring 容器管理,實現解耦:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 1. 配置Spring內置連接池 --><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><!-- 2. 配置JdbcTemplate并注入連接池 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean></beans>

2. 基于 Spring 測試的依賴注入

通過@Autowired自動獲取JdbcTemplate,簡化代碼:

package com.qcbyjy.test.demo1;import com.qcbyjy.demo1.model.Account;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;//使用Spring框架來管理模板類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:applicationContext_jdbc.xml")
//@ContextConfiguration(value = "classpath:applicationContext_druid.xml")
public class Demo1_1 {@Autowiredprivate JdbcTemplate jdbcTemplate;//測試
//    插入@Testpublic void run1() {jdbcTemplate.update("INSERT  into account VALUES (null,?,?)", "圈圈", 5000);}//    修改@Testpublic void run2() {jdbcTemplate.update("UPDATE  account set name=?,money=? where id=?", "光頭強", 122, 7);}//    刪除@Testpublic void run3() {jdbcTemplate.update("delete from account where id=?", 7);}//    通過id查詢@Testpublic void run4() {// 使用自定義RowMapper將ResultSet映射為Java對象Account account = jdbcTemplate.queryForObject("select *  from account where id=?", new BeanMapper(), 8);System.out.println(account);}//查詢所有的數據@Testpublic void run5(){List<Account> list=jdbcTemplate.query("select * from account",new BeanMapper());for (Account account:list){System.out.println(account);}}// 自定義結果映射器class BeanMapper implements RowMapper<Account> {public Account mapRow(ResultSet resultSet, int i) throwsSQLException {Account account = new Account();account.setId(resultSet.getInt("id"));account.setName(resultSet.getString("name"));account.setMoney(resultSet.getDouble("money"));return account;}}
}

四、集成開源連接池(以 Druid 為例)

1. 添加 Druid 依賴

?在pom.xml中引入 Druid 坐標:

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>

2. 配置屬性文件(jdbc.properties

?將數據庫連接信息外置到配置文件,便于維護:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_db
jdbc.username=root
jdbc.password=root

3. Spring 配置文件整合 Druid

通過<context:property-placeholder>加載屬性文件,并替換為 Druid 連接池:

<beans ...><!-- 加載屬性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 使用Druid連接池 --><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><!-- JdbcTemplate配置不變 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>
</beans>

六、總結

核心流程

  1. 引入依賴:包含 Spring JDBC 模塊、數據庫驅動和連接池(如 Druid)。
  2. 配置連接池:通過 Spring 配置文件管理數據庫連接信息,支持內置或開源連接池。
  3. 注入模板類:將JdbcTemplate納入 Spring 容器,通過依賴注入獲取實例。
  4. 執行操作:利用JdbcTemplate的增刪改查方法,結合RowMapper處理結果集。

最佳實踐

  • 外置配置:將數據庫連接信息放入屬性文件,避免硬編碼。
  • 使用開源連接池:優先選擇 Druid 等高性能連接池,提升應用性能。
  • 結合 Spring 測試:通過@RunWith@ContextConfiguration簡化測試代碼。

通過以上實踐,開發者可以大幅提升 JDBC 開發效率,將更多精力聚焦于業務邏輯實現。

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

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

相關文章

Axure難點解決分享:統計分析頁面引入Echarts示例動態效果

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:統計分析頁面引入Echarts示例動態效果 主要內容:echart示例引入、大小調整、數據導入 應用場景:統計分析頁面…

SpringBoot 數據校驗與表單處理:從入門到精通(萬字長文)

一、SpringBoot 數據驗證基礎 1.1 數據驗證的重要性 在現代Web應用開發中&#xff0c;數據驗證是保證系統安全性和數據完整性的第一道防線。沒有經過驗證的用戶輸入可能導致各種安全問題&#xff0c;如SQL注入、XSS攻擊&#xff0c;或者簡單的業務邏輯錯誤。 數據驗證的主要…

Ubuntu 22.04(WSL2)使用 Docker 安裝 Zipkin 和 Skywalking

Ubuntu 22.04&#xff08;WSL2&#xff09;使用 Docker 安裝 Zipkin 和 Skywalking 分布式追蹤工具在現代微服務架構中至關重要&#xff0c;它們幫助開發者監控請求在多個服務之間的流動&#xff0c;識別性能瓶頸和潛在錯誤。本文將指導您在 Ubuntu 22.04&#xff08;WSL2 環境…

python打卡day25@浙大疏錦行

知識點回顧&#xff1a; 1.異常處理機制 2.debug過程中的各類報錯 3.try-except機制 4.try-except-else-finally機制 在即將進入深度學習專題學習前&#xff0c;我們最后差缺補漏&#xff0c;把一些常見且重要的知識點給他們補上&#xff0c;加深對代碼和流程的理解。 作業&a…

鴻蒙OSUniApp 開發實時聊天頁面的最佳實踐與實現#三方框架 #Uniapp

使用 UniApp 開發實時聊天頁面的最佳實踐與實現 在移動應用開發領域&#xff0c;實時聊天功能已經成為許多應用不可或缺的組成部分。本文將深入探討如何使用 UniApp 框架開發一個功能完善的實時聊天頁面&#xff0c;從布局設計到核心邏輯實現&#xff0c;帶領大家一步步打造專…

43、Server.UrlEncode、HttpUtility.UrlDecode的區別?

Server.UrlEncode 和 HttpUtility.UrlDecode 是 .NET 中用于處理 URL 編碼/解碼的兩個不同方法&#xff0c;主要區別在于所屬命名空間、使用場景和具體行為。以下是詳細對比&#xff1a; 1. 所屬類庫與命名空間 Server.UrlEncode 屬于 System.Web.HttpServerUtility 類。通常…

代碼隨想錄 算法訓練 Day1:數組

題目一&#xff1a; 給定一個 n 個元素有序的&#xff08;升序&#xff09;整型數組 nums 和一個目標值 target &#xff0c;寫一個函數搜索 nums 中的 target&#xff0c;如果目標值存在返回下標&#xff0c;否則返回 -1。 示例 1: 輸入: nums [-1,0,3,5,9,12], target …

容器技術 20 年:顛覆、重構與重塑軟件世界的力量

目錄 容器技術發展史 虛擬化技術向容器技術轉變 Docker的橫空出世 容器編排技術與Kubernetes 微服務的出現與Istio 工業標準的容器運行時 容器技術與 DevOps 的深度融合? 無服務架構推波助瀾 展望未來發展方向 從 20 世紀硬件虛擬化的笨重&#xff0c;到操作系統虛擬…

集成釘釘消息推送功能

1. 概述 本文檔詳細描述了在若依框架基礎上集成釘釘消息推送功能的開發步驟。該功能允許系統向指定釘釘用戶發送文本和富文本消息通知。 2. 環境準備 2.1 釘釘開發者賬號配置 登錄釘釘開發者平臺&#xff1a;https://open.dingtalk.com/創建/選擇企業內部應用獲取以下關鍵信…

【行為型之訪問者模式】游戲開發實戰——Unity靈活數據操作與跨系統交互的架構秘訣

文章目錄 &#x1f9f3; 訪問者模式&#xff08;Visitor Pattern&#xff09;深度解析一、模式本質與核心價值二、經典UML結構三、Unity實戰代碼&#xff08;游戲物品系統&#xff09;1. 定義元素與訪問者接口2. 實現具體元素類3. 實現具體訪問者4. 對象結構管理5. 客戶端使用 …

SQL:MySQL函數:日期函數(Date Functions)

目錄 時間是數據的一種類型 &#x1f9f0; MySQL 常用時間函數大全 &#x1f7e6; 1. 獲取當前時間/日期 &#x1f7e6; 2. 日期運算&#xff08;加減&#xff09; &#x1f7e6; 3. 時間差計算 &#x1f7e6; 4. 格式化日期 &#x1f7e6; 5. 提取時間部分 &#x1f7…

【MySQL】數據表更新數據

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;MySQL 文章目錄 1. 數據更新基礎1.1 更新操作的重要性1.2 更新語句基本結構1.3 更新操作注意事項 2. 基本更新操作2.1 基本UPDATE語法2.2 使用表達式更新數據2.3 使用LIMIT限制更新行數2.4 NULL值處理 3. 高級更新技術3.1 使用子…

【更新】全國省市縣-公開手機基站數據集(2006-2025.3)

手機基站是現代通信網絡中的重要組成部分&#xff0c;它們為廣泛的通信服務提供基礎設施。隨著數字化進程的不斷推進&#xff0c;手機基站的建設與布局對優化網絡質量和提升通信服務水平起著至關重要的作用&#xff0c;本分享數據可幫助分析移動通信網絡的發展和優化。本次數據…

藍橋杯12屆國B 純質數

題目描述 如果一個正整數只有 1 和它本身兩個約數&#xff0c;則稱為一個質數&#xff08;又稱素數&#xff09;。 前幾個質數是&#xff1a;2,3,5,7,11,13,17,19,23,29,31,37,??? 。 如果一個質數的所有十進制數位都是質數&#xff0c;我們稱它為純質數。例如&#xff1…

騰訊多模態定制化視頻生成框架:HunyuanCustom

HunyuanCustom 速讀 一、引言 HunyuanCustom 是由騰訊團隊提出的一款多模態定制化視頻生成框架。該框架旨在解決現有視頻生成方法在身份一致性(identity consistency)和輸入模態有限性方面的不足。通過支持圖像、音頻、視頻和文本等多種條件輸入&#xff0c;HunyuanCustom 能…

力扣top100 矩陣置零

開辟數組來標記元素為0的行和列&#xff0c;然后將對應的行和列的元素全部置為0&#xff1b; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …

Python知識框架

一、Python基礎語法 變量與數據類型 變量命名規則 基本類型&#xff1a;int, float, str, bool, None 復合類型&#xff1a;list, tuple, dict, set 類型轉換與檢查&#xff08;type(), isinstance()&#xff09; 運算符 算術運算符&#xff1a;, -, *, /, //, %, ** 比較…

華為OD機試真題——單詞接龍(首字母接龍)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

微信小程序智能商城系統(uniapp+Springboot后端+vue管理端)

一、系統介紹 本智能商城系統是基于當今主流技術棧開發的一款多端商城解決方案&#xff0c;主要包括微信小程序前端、SpringBoot 后端服務以及 Vue 管理后臺三大部分。系統融合了線上商城的核心功能&#xff0c;支持商品瀏覽、下單、支付、訂單管理等操作&#xff0c;適用于中小…

Python筆記:c++內嵌python,c++主窗口如何傳遞給腳本中的QDialog,使用的是pybind11

1. 問題描述 用的是python 3.8.20, qt版本使用的是5.15.2, PySide的版本是5.15.2, pybind11的版本為2.13.6 網上說在python腳本中直接用PySide2自帶的QWinWidget&#xff0c;如from PySide2.QtWinExtras import QWinWidget&#xff0c;但我用的版本中說沒有QWinWidget&#x…