1. 程式人生 > >Spring JDBC 的設計與實現

Spring JDBC 的設計與實現

一、Spring JDBC的設計與實現

(一)應用場景

        在Java開發環境中,使用JDBC技術對關係資料庫進行操作。通過JDBC,Java語言的客戶端可以訪問資料庫的資料,比如CRUD等對資料庫的基本操作。儘管在實際應用中,對應不同的資料庫產品,還需要有相對應的資料庫驅動作為支援,但由於有了JDBC和SQL,對資料庫應用而言,其程式的可移植性在很大程度上得到了增強。

        JDBC已經能夠滿足大部分使用者操作資料庫的需求,但在使用JDBC時,應用必須自己來管理資料庫資源,比如資料庫連線、資料庫事務、資料庫異常等,對底層的資料庫實現還有一定的依賴。作為應用開發平臺的Spring,對資料庫操作需求提供了很好的支援,並在原始的JDBC基礎上,構建了一個抽象層,提供了許多使用JDBC的模板和驅動模組,為Spring應用操作關係型資料庫提供了更大的便利。這些設計好的模組,封裝了資料庫資料存取的基本過程,並在具體的操作步驟上為使用者提供了定製空間(模板模式的使用)。通過這種方式,一方面提高了應用開發的效率,另一方面又為應用程式開發提供了靈活性。另外,在Spring建立的JDBC的框架中,還設計看一種更面向物件的方法,相對於JDBC模板,這種實現更像是一個簡單的ORM工具。為應用提供了另外一種選擇。下面將對這兩種設計進行詳細分析。

(二)設計概要

        Spring JDBC提供了一系列的模板類為應該提供便利,在介紹Spring JDBC的設計之前,先回顧一下模板模式。

        如圖,在模板模式中,一般會定義一個抽象方法,在抽象方法中定義了模板方法(TemplateMethod)。在模板方法中,會對處理進行描述,同時,這個描述中的一些方法(PrimitiveOperation)是可以靈活處理的。模板使用者只需要實際一個具體的類,繼承模板類,然後制定那些具體的方法,這樣既能重用整個模板的處理框架,又能發揮具體子類的靈活性,所以這種模式被稱為模板模式。這種模式在Spring中是很常見的,比如JdbcTemplate、HibernateTemplate等。在這些Spring設計的模版中,大部分封裝了對JDBC和Hibernate處理的通用過程,比如資料庫資源管理、Hibernate的Session管理等,在應用使用時,只需要實際資金定製化的或者和應用相關的部分就可以了。

二、Spring JDBC中模板類的設計與實現

(一)設計原理

        在Spring JDBC中,JdbcTemplate是一個主要的模板類,它的繼承關係如下:

         從類繼承關係上看,JdbcTemplate繼承了基類JdbcAccessor和介面JdbcOperation。在基類JdbcAccessor的設計中,對DataSource資料來源進行管理和配置。在JdbcOperation介面中,定義了通過JDBC操作資料庫的基本操作方法,而JdbcTemplate提供這些介面方法的實現,比如execute()方法、query()方法、update()方法等。

(二) JdbcTemplate的基本使用

        在Spring JDBC中,JdbcTemplate是操作資料庫的類,它提供了許多便利的資料庫操作方法,比如查詢、更新等。而且,在Spring中,有許多類似於JdbcTemplate的模板類,使用方法也都非常類似,比如在ORM包中會看到的HibernateTemplate等。

       簡單看來,這些在Spring中涉及和實現好的模板類都是通過回撥函式的使用來完成其功能的。對滿足應用的資料庫操作需求而言,應用程式只需要在回撥介面中實現自己需要的定製行為,比如使用客戶設計好的SQL語句等,就能夠完成對資料庫中資料的操作。不過,Spring JDBC在這層回撥函式的基礎上進行了再次封裝,為使用者提供了許多操作資料庫的現成方法,在一定程度上便於使用者使用。JdbcTemplate是一個很重要的類,它的繼承關係和主要的實現方法如下:

         可以看到一系列的execute()方法、query()方法、update()方法的實現,具體實現可參考原始碼。在使用JdbcTemplate的execute()方法通過StatementCallBack<T>回撥的使用方法如下,通過該方法可以定製個性化 的ORM方法。

        在模板方法的回撥方法doInStatement()中是使用者對資料庫進行操作的程式碼,可以由Spring來完成(excute(String sql))或者由使用者直接完成(excute(StatementCallBack<T> callBack)),然後通過JdbcTemplate來完成相應的資料庫操作。

(三)JdbcTemplate的execute()方法實現

        下面以JdbcTemplate.execute()為例進一步分析JdbcTemplate中的程式碼是如何完成使命的。這個方法是在JdbcTemplate中被其他方法呼叫的基本方法之一,應用程式往往使用這個方法來執行基本的SQL語句。在execute()的實現中看到了對資料庫進行操作的基本過程,比如需要取得資料庫Connection,根據應用對資料庫操作的需要建立資料庫的State-ment,對資料庫操作進行回撥,處理資料庫異常,最後把資料庫Connection關閉等。這裡展示了使用JDBC完成資料庫操作的完整過程,只是Spring對這些較為通用的JDBC使用通過JdbcTemplate進行了一個封裝而已。Execute()方法的原始碼和設計如下:

JdbcTemplate.execute()

(四)JdbcTemplate的query()方法實現

        JdbcTemplate中給出的query()、update()等常用方法的實現,大對數都是依賴於前面提到的execute()方法。下面是quary()方法是設計時序和原始碼實現:

JdbcTemplate.query()

(五)使用資料庫Connection

        在以上這些對資料庫的操作中,使用了工具類DataSourceUtils。Spring通過這個輔助類對資料庫的Connection進行管理,比如利用它來完成開啟和關閉Connection等。Data-SourceUtils對這些資料庫Connection管理的實現如下:

DataSourceUtils.getConnection()

DataSourceUtil.doGetConnection()

        DataSource可以使用DBCP連線池或C3P0連線池,然後在IoC容器中配置好後交給Jdbc-Template就可以使用了。同時,有了JdbcTemplate封裝的方法,使一些簡單的JDBC操作變得非常方便。JdbcTemplate提供了許多現成的查詢方法,比如queryForInt()、queryForObj-ect()等,已經能夠很好的滿足一些簡單的JDBC查詢處理了。和查詢一樣,JdbcTemplate也提供了許多不同引數型別的update()方法供使用者使用,這些update()方法實現原理與query()方法基本相同。

三、Spring JDBC中DBMS操作物件的實現

        前面介紹了JdbcTemplate提供了許多簡單的查詢和更新功能。但是,有時可能需要更高層次的抽象,以及更面向物件的方法來訪問資料庫。Spring為我們提供了org.springfra-mework.jdbc.object包,其中包含SqlQuery、SqlMappingQuery、SqlUpdate和StoredProced-ure等類,這些類都是Spring JDBC應用程式可以使用的。但要注意,在使用這些類時需要為它們配置好JdbcTemplate座位其基本的操作實現,因為在它們的功能實現中,對資料庫操作的實現基本上還是依賴於JdbcTemplate來完成的。

        下面將對Spring JDBC中的一些DBMS操作物件的實現進行分析。DBMS物件基本繼承關係如下:

        在這個繼承關係圖中可以看到RdbmsOperation的一系列子類,不然StoreProcedure、  SqlQuery、MappingSqlQuery、SqlUpdate等。這些子類構成了DBMS體系,為通過JDBC完成資料庫操作提供了更強大的功能。

(一)SqlQuery的實現

        Spring除了提供對JDBC的基本操作的支援之外,還為應用在更高層面上使用關係型資料庫提供了許多支援,這些支援都建立在Spring JDBC實現的基礎是哪個。這樣,使用者可以省去許多重複的手工程式碼,充分發揮框架的作用。比如,可以使用MappingSqlQuery將資料庫表的資料記錄直接對映到一個物件集合,這是一個很有用的特性,類似於一個簡單的ORM實現。

        在瞭解這個特性的實現之前,可以先回顧一下它的基本用法。

        可以看到,對MappingSqlQuery使用的整個過程是非常簡潔的。在設計好資料的對映程式碼後,查詢得到的記錄會被封裝好轉換為物件List。一條查詢記錄對應於一個數據物件,即可以吧資料庫的記錄直接對映成為Java物件在程式中使用,又可以避免使用第三方的ORM工具的配置,這對於簡單的資料對映場景十分方便。mapRow()方法的實現中提供的資料轉換規則和Hibernate的hbm檔案的作用是非常相似的。

        在這個之後,我們只需要建立好MappingSqlQuery實現類物件,設定好SQL語句,設定好SQL引數,然後呼叫ScategoryMappingQuery物件的execute()方法即可。下面我們看一下declareParameter()方法與execute()方法的實現:

RdbmsOperation.declareParameter()

        從程式碼可以看出,RbdmsOperation實現的引數宣告和完成並不複雜,只是把需要宣告的引數加入一個宣告引數列表。為了防止引數的重負加入,需要對isCompiled變數進行。isComplied變數在compile()方法呼叫時設定,標識compile()過程已經執行過了。該過程執行完後將執行execute()方法。

SqlQuery.execute()

        1)首先執行RdbmsOperationvalidateParametes()方法對SQL語句引數進行驗證,該方法中先執行了checkCompiled()方法,檢查是否執行compile()過程,若未執行,則呼叫comp-ile()方法執行。

RdbmsOperation.validateParameters()

RdbmsOperation.checkCompiled()

RdbmsOperation.compile()

RdbmsOperation.compileInternal()

        2)最後呼叫JdbcTemplatequery()方法進行資料庫操作,通過execute()方法繫結PrepardStatementCallback回撥,最終通過PrepatedStatement進行資料庫操作,得到結果後通過ResultSetExtractor結果集物件處理。ResulteSetExtractor進行結果集處理的過程在Prepar-dStatementCallbackdoInPreparedStatement()回撥方法中進行。

JdbcTemplate.query()

RowMapperResultSetExtractor.extractData()

        下面是該execute()方法的具體實現,在該實現中需要傳入的引數有兩個,一個是PreparedStatementCreator物件,另一個是PreparedStatementCallback實現物件。該方法裡首先建立資料庫Connection,然後使用PreparedStatementCreator建立PreparedStatement物件,最後呼叫PreparedStatementCallback實現物件的doInPreparedStatement()方法執行使用PreparedStatement執行資料庫操作得到結果集,並使用ResultSetExtractor的extract-Date()方法處理結果集。

JdbcTemplate.execute()

PreparedStatementCreatorFactory.createPreparedStatement()

        在這裡,通過這些封裝和Spring提供的模板程式碼,只需要定義SQL語句和SqlParameter就能夠滿足需求。同時,這些特性也大大增強了應用程式碼的模組化和可維護性。

        通過分析發現,最後的資料庫操作還是由JdbcTemplate來完成的。在這裡可以瞭解對JdbcTemplate的靈活應用。從另一方面來看,這些已有的Spring JDBC實現對JdbcTemplate的擴充套件,已經直接使用JdbcTemplate完成複雜資料庫操作的應用而言,也是很好的參考。通過使用Spring JDBC提供的SqlQuery基本特性,可以免去手工處理ResuktSet資料,並對其中每一條記錄進行逐個迭代,手工轉化為Java資料物件的繁瑣過程。

相關推薦

Spring JDBC設計實現

一、Spring JDBC的設計與實現 (一)應用場景         在Java開發環境中,使用JDBC技術對關係資料庫進行操作。通過JDBC,Java語言的客戶端可以訪問資料庫的資料,比如CRUD等對資料庫的基本操作。儘管在實際應用中,對應不同的資料庫產品

Spring IoC 容器的設計實現原理

上一篇文章講解的是IOC的原理,這一篇文章主要講解Spring IoC 容器的設計與實現原理   1.spring的IOC容器 在 Spring IoC 容器的設計中,容器有兩個系列,可以看成是容器的具體表現形式: BeanFactory 簡單容器:實現了容器的基本

基於spring法蘭產品質量檢驗管理系統的設計實現

**基於spring法蘭產品質量檢驗管理系統的設計與實現** 基於spring法蘭產品質量檢驗管理系統的設計與實現mysql資料庫建立語句 基於spring法蘭產品質量檢驗管理系統的設計與實現oracle資料庫建立語句 基於spring法蘭產品質量檢驗管理系統的設計與實現

基於Spring Boot的“課程設計”的設計實現

這是一個集電影,音樂和書籍於一體的Java web應用 Java 1.8 框架:使用Spring Boot 整合Spring,Spring MVC,MyBatis(前期),Spring Data(後期) 資料庫:MySQL 5.6 快取:

Spring IoC容器應用上下文的設計實現

一、前言   寫這篇博文的主要目的如下: 通過相關類和介面分析IoC容器到底長什麼樣。 闡述筆者對Spring上下文和容器的理解。 介紹重要的類輔助理解SpringBoot的啟動流程。   二、Spring IoC容器的設計   看看下面這張圖(摘自《Spring技術內幕》),

Reactive Spring實戰 -- 理解Reactor的設計實現

Reactor是Spring提供的非阻塞式響應式程式設計框架,實現了Reactive Streams規範。 它提供了可組合的非同步序列API,例如Flux(用於[N]個元素)和Mono(用於[0 | 1]個元素)。 Reactor Netty專案還支援非阻塞式網路通訊,非常適用於微服務架構,為HTTP(包括

jQuery架構設計實現(2.1.4版本)

需要 引入 hasclass 8.4 uri and hub 組織 移除 市面上的jQuery書太多了,良莠不齊,看了那麽多總覺得少點什麽 對"幹貨",我不喜歡就事論事的寫代碼,我想把自己所學的知識點,代碼技巧,設計思想,代碼模式能很好的表達出來,所以考慮通過分析jQuer

畢業設計-證券宣傳手機微網站的設計實現

信息 browser .com 接受 熱點 互聯網 計算機網絡 業務 結構 本文介紹基於.net的證券公司宣傳微網站手機網頁的設計與實現方法。 隨著計算機技術的快速發展,基於Web的計算機網絡金融、證券宣傳或交易網站已成為現代金融理財發展的熱點,B/S(Browser/Se

MVC實戰之排球計分(四)—— View設計實現

service family 角色 元素 需要 rom 之前 con xsl (view)視圖 視圖是用戶看到並與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出

MVC實戰之排球計分(五)—— Controller的設計實現

需要 strong 技術 ret web src alt 點擊 cnblogs 控制器 控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求。所以當單擊Web頁面中的超鏈接和發送HTML表單時, 控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處

stm32視頻教程分享:心率檢測儀的設計實現

stm32視頻教程分享:心率檢測儀的設計與實現 STM32系列是基於專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M3內核。 本項目主要講述了通過心律傳感器采集我們的心律數據,然後通過串口傳送到上位機中,上位機用Qt

MVC之排球比賽計分程序 ——(四)視圖的設計實現

元素 role view logs image 技術 size 之前 log (view)視圖 視圖是用戶看到並與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術

MVC之排球比賽計分程序 ——(三)model類的設計實現

比賽 用戶 count class 包括 result 控制 類的設計 可能 實體類是現實實體在計算機中的表示。它貫穿於整個架構,負擔著在各層次及模塊間傳遞數據的職責。一般來說,實體類可以分為“貧血實體類”和“充血實體類”,前者僅僅保存實體的屬性,而後者還包含一些實體間的關

模型類的設計實現(四)

介紹 傳遞數據 規則 添加 play using ota 實體類 重要 實體類是現實實體在計算機中的表示。它貫穿於整個架構,負擔著在各層次及模塊間傳遞數據的職責。 一般來說,實體類可以分為“貧血實體類”和“充血實體類”,前者僅僅保存實體的屬性,而後者還包含一些實體間的關系與

jQuery技術內幕:深入解析jQuery架構設計實現原理

源碼 att root 功能 技術內幕 瀏覽器 sel 緩存 callbacks jQuery源碼(jquery-1.7.1.js)的總體結構:(function( window, undefined ) {// 構造jQuery對象 var jQuery = (fun

軟件設計實現

一個 基礎 建模 分析 解決 是什麽 哪些 模型 動態 我們寫軟件就是要解決用戶的需求,我麽需要表達和傳遞下面的信息,在“需求分析”階段,我們要搞清楚在問題領域中的現實世界中,都有哪些實體,如何抽象出我們真正的關心的屬性,實體之間的關系是什麽,在這個基礎上,用戶的需求是什麽

自己主動升級系統的設計實現(續2) -- 添加斷點續傳功能 (附最新源代碼)

blog down 決定 top lin dom itl com 關於 一.緣起      之前已經寫了兩篇關於自己主動升級系統OAUS的設計與實現的文章(第一篇、第二篇)。在為OAUS服務端添加自己主動檢測文件變更的功能(這樣每次部署版本號升級時,能夠節省非常多時間。

隊列順序存儲 - 設計實現 - API函數

http 出隊 插入 tmp .cpp tdi tree 順序 位置 隊列是一種特殊的線性表 隊列僅在線性表的兩端進行操作 隊頭(Front):取出數據元素的一端 隊尾(Rear):插入數據元素的一端 隊列不同意在中間部位進行操作! queu

IM系統中聊天記錄模塊的設計實現

人的 dex auto 由於 模型 速度 開發 構造 qlite  看到很多開發IM系統的朋友都想實現聊天記錄存儲和查詢這一不可或缺的功能,這裏我就把自己前段時間為傲瑞通(OrayTalk)開發聊天記錄模塊的經驗分享出來,供需要的朋友參考下。 一.總體設計 1.存儲位置  

視頻教程免費分享:嵌入式stm32項目開發之心率檢測儀的設計實現

視頻教程免費分享:嵌入式stm32項目開發之心率檢測儀的設計與實現 本課程主要基於心率檢測儀的設計與實現講解STM32開發技術,STM32開發板廣泛應用於儀器儀表、家用電器、醫用設備、航空航天、專用設備的智能化管理、機器人及過程控制等領域,完成數據監控、數據處理、數據傳遞等功