文/武宗品
信息化系統包含信息的采集、處理、分析和統計,在此過程中,需要進行信息的持久化存儲。信息系統當前大多數使用關系型數據庫來存儲信息。
根據TIOBE 排行榜,Java 依然是排名第一的開發語言,因此公司使用Java 開發信息化系統。面向對象是Java 的一大特點,在使用面向對象方法進行系統開發時,需要用實體對象來表示所處理的信息。因此,就需要不斷的對信息進行關系型數據和實體對象的互轉,即所謂的對象關系映射(Object-Relational Mapping,簡稱ORM)。
目前有多種框架幫助開發者簡化ORM 的開發,例如Hiberante 和iBatis。這些框架有諸多優勢,但同時也存在天然缺陷:由于是在程序運行時才會生產數據庫操作,導致在開發時難以調試,難以進行SQL 優化。
針對上述問題,本文提出并實現了一個輕量級的Java 數據庫操作組件——DatabaseOperator,該組件為開發人員提供一個簡單、高效、方便調試和優化的數據庫操作方法。由于可以自行控制SQL 語句,并且無需關注JDBC 的各種狀態維護,為開發人員提供了更大的靈活性,減輕了許多冗余代碼。該組件已經在公司開發的多套系統中使用。
數據庫操作組件DatabaseOperator 為了保留調試和SQL 優化的特性,選擇采用JDBC來直接操作數據庫。同時,為了簡化開發人員的操作,降低代碼冗余,減少開發人員對數據庫連接的維護工作,組件將采用狀態模式和觀察者模式這兩個設計模式作為設計指導。
Erich Gamma 等人給出了設計模式的定義,可以這樣去理解它:設計模式和語言無關,通常是一種針對某類問題或場景,將變化的部分抽離出去,將不變的部分保留下來,最終形成的一個解決問題的套路或思考范式。本小節將對用到的兩個設計模式進行簡單介紹。

圖1:標準數據庫操作

圖2:數據庫操作狀態
1.1.1 狀態模式
該模式的定義:狀態模式允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。普遍的說,當要處理的事情有不同的狀態,并且在不同的狀態有不同的行為,狀態與狀態之間有明確的轉換觸發條件,對于存在這種情況的可以使用狀態模式來指導設計,規范代碼結構。
1.1.2 觀察者模式
該模式的定義:觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知并自動更新。普遍的說,當要處理的事情有一個明確的第三方,該第三方需要獲取相關對象的行為,并在全部或者某些行為時第三方有自己的行動,對于存在這種情況的可以使用觀察者模式來指導設計。
Java 數據庫連接,(Java Database Connectivity,簡稱JDBC)是Java 語言中用來規范客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。
本小節首先介紹標準的數據庫操作方法,然后通過分析,設計出一套簡潔高效的數據庫操作組件并進行實現。
如圖1所示,是一個Java 上的標準數據庫操作步驟:①定義變量;②連接數據庫;③業務操作(本例是一個最簡單的業務查詢操作);④處理業務異常;⑤關閉數據庫連接。
上節所介紹的標準數據庫操作中,對于開發人員需要關注的只有“③業務操作”這一部分,可以看到其余都是無需關注的,如何抽離那些無需關注的而只保留需要關注的部分是實現組件的關鍵。
通過分析,可知在操作數據庫的時候,經歷了如下幾個步驟:參數初始化;連接數據庫;處理業務;完成并關閉。在每一個步驟中,都會有不同的操作,并且步驟之間的轉換都是通過固定的操作來完成的。針對這種場景,使用“狀態模式”來進行設計:將數據庫操作的每一步都看作一個狀態,在獨立的狀態中,只需關注當前狀態要做的事情,狀態與狀態之間的轉換,交給幾個專門的處理方法來完成即可。圖1所示的數據庫操作只是基本的業務查詢操作,考慮到還有批量操作、存儲過程操作和事務操作,最終設計的狀態機如圖2所示:init(初始狀態);transaction(事務狀態);sqlDone(業務狀態);callable(存儲過程狀態);batch(批量業務狀態)。觸發狀態轉換的操作有:startTransaction,開啟事務;commit,提交事務;setSql,設定數據庫操作語句;setPS,動態SQL 參數;execute/query,增刪改查;setCallable,設定存儲過程;setCallableHandler,設定存儲過程回掉;addSql,添加批量SQL;addBatch,添加批量操作;executeBatch,執行批量操作;end,結束操作。

圖3:實現
通過分析,數據庫在操作的過程中,為了讓開發人員專注于業務,而無需關注和維護當前數據庫連接的建立與關閉,需要有第三方來監控現在的操作狀態,并在操作結束時關閉數據庫連接、回收對象。針對這種場景,使用“觀察者模式”來指導設計:當開始進行數據庫操作的時候,監控對象訂閱數據庫操作對象的通知,數據庫操作結束時發出通知,監控對象負責完成關閉數據庫連接和回收對象的工作。
根據分析與設計,數據庫操作組件的實現如圖3所示。
開發人員在使用該組件的時候,需要操作圖1所示的業務時,實際代碼如圖4所示。由此可見,不僅保留了SQL 的可調式性,也大大減少了開發的工作量。
在結合了狀態模式和觀察者模式之后,對JDBC 進行了重新的封裝,完成了DatabaseOperator 數據庫操作組件的開發。使用該組件,無需引用大量的框架,能夠快速搭建信息系統,簡化代碼工作量,保持SQL 可調式,確保數據庫優化的可控性,為公司多個項目的開發提高了效率,降低了出錯率。同時,在實踐中也發現該組件還有可以不斷優化的地方,例如:與數據庫的連接除了自己創建之外,還可以交給數據庫連接池來進行管理,從而提高連接效率;數據查詢后的結果,可以使用反射機制將查詢后的結果直接轉變成對象。

圖4:使用組件后的數據庫操作