使用設計模式構建通用資料庫訪問類 (轉)
作者:孫亞民 本文選自:賽迪網 年03月20日
在應用的設計中,資料庫的訪問是非常重要的,我們通常需要將對資料庫的訪問集中起來,以保證良好的封裝性和可維護性。在中,資料庫的訪問,對於自家的Server和其他資料庫(支援Ole),採用不同的訪問方法,這些類分別分佈於System.Data.SqlClient和System.Data.OleDb名稱空間中。微軟後來又推出了專門用於訪問資料庫的類庫。我們希望在編寫應用的時候,不因這麼多類的不同而受到影響,能夠儘量做到資料庫無關,當後臺資料庫發生變更的時候,不需要更改客戶端的程式碼。
有的時候,為了和其他原因,我們也希望提供對資料庫訪問的快取,特別是資料庫連線的快取。雖然微軟給我們內建了資料庫快取,但是,自己控制快取,無疑可以提供更大的靈活性和。
這就需要我們在實際開發過程中將這些資料庫訪問類再作一次封裝。這裡,介紹一種在實際應用中得到了非常好的效果的實作策略。Factory和Silgleton設計模式是使用的主要方法。
我們先來看看Factory的含義:定義一個用於建立的介面,讓子類決定例項化哪一個類。Factory Method使一個類的例項化延遲到其子類。我們這裡可能會處理對多種資料庫的操作,因此,需要首先定義一個操縱資料庫的介面,然後,根據資料庫的不同,由類工廠決定例項化哪個類。
下面,我們首先來定義這個訪問介面。為了方便說明問題,我們為這個類定義了比較少的方法,其他的方法是很容易參照新增的。同時注意,我這裡使用了abstract class來定義這個訪問介面,而不是interface,理由在後面可以看到。
然後,我們分別為和OleDb資料庫編寫兩個資料訪問的具體實現類:
Sql Server的資料庫訪問類:
OleDb資料庫操作的類同Sql Server資料庫操作的類非常相似,只是把相應的Sql類替換成OleDb類。需要注意的是,因為OleDb和Sql Server的引數傳遞方式不一致,所以,這裡需要做一點小小的轉換,將"@引數名"型別的引數轉換成"?",這個細節希望讀者能夠注意到。程式碼如下:
現在我們已經完成了所要的功能,下面,我們需要建立一個Factory類,來實現自動資料庫切換的管理。這個類很簡單,主要的功能就是根據資料庫連線字串,判斷使用什麼資料庫,然後,返回適當的資料庫操縱類。在這裡,判斷的方法很簡單,只是根據兩種資料庫連線字串的不同來判斷。在實際中,隨著資料庫類的增加,判斷的方法可能會有所變化,讀者應當根據自己的實際情況來做相應的調整。
好了,現在,一切都完成了,客戶端在程式碼的時候,可能就是採用如下形式:
當資料庫發生變化的時候,DBOperatorFactory會根據資料庫連線字串自動呼叫相應的類,客戶端不會感覺到變化,也不用去關心。這樣,實現了良好的封裝性。當然,前提是,你在編寫程式的時候,沒有用到特定資料庫的特性,例如,Sql Server的專用。
實際上,Factory模式也可以不使用Factory類來實現,而是讓介面抽象類自己來管理,這可以稱作自管理的Factory,是Factory模式的一種變形。這麼做的好處,是可以免去一個Factory類,使程式碼更加簡練。這麼做,我們需要對DBOperator類做一些改變,增加一個Instance方法。這也是對DBOperator採用抽象類而不是介面的原因(介面的方法不能有實現),程式碼如下:
然後,客戶端程式碼就可能是類似於下面的形式:
下面來看看連線池的做法,方法就是Singleton。
先看Singleton模式的經典含義:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。推而廣之,當我們需要精確控制類在系統中的例項的個數的時候,就可以使用Singleton模式。現在,我們需要構建一個緩衝池,儲存資料庫類的例項,正好是Singleton模式發揮作用的時候。
我們仍然讓DBOperator類自己來管理這個緩衝池,為了實現這個目的,我們需要對DBOperator類做一些變化:
首先,增加兩個變數:
然後,對Instance方法做一些改變:
這裡使用的演算法比較簡單,只是為了能夠比較清楚地說明問題,讀者應當能夠在實際使用過程中,實現更好的演算法。
以上,介紹了一種通用資料庫操作類的實現設計方法,希望能夠對大家有所啟發。筆者設計sh的時候,在資料庫處理層,採用了上面的方法,取得了很好的效果。
作者:孫亞民,畢業於南京大學,中國科技大學技術在讀研究生,熟悉和.Net平臺,蘇州某公司技術總監,基於.Net平臺的Websharp中介軟體的設計者。可以透過 sunny_y_m@163.聯絡。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-961000/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP設計模式-DAO (Data Access Objects) 資料訪問物件模式PHP設計模式Object物件
- 極簡架構模式-資料訪問物件模式架構模式物件
- 設計模式(十六)——訪問者模式設計模式
- 設計模式學習-使用go實現訪問者模式設計模式Go
- 3.2.4 開啟資料庫到限制訪問模式資料庫模式
- 使用 @NoRepositoryBean 簡化資料庫訪問Bean資料庫
- jmeter 使用 ssh 方式訪問資料庫JMeter資料庫
- 極簡設計模式-訪問者模式設計模式
- derby 資料庫 伺服器模式 無法訪問資料庫伺服器模式
- 設計模式 - ASM 中的訪問者模式設計模式ASM
- 設計模式學習之訪問者模式設計模式
- C#設計模式之訪問者模式C#設計模式
- 【趣味設計模式系列】之【訪問者模式】設計模式
- C++設計模式 - 訪問器模式(Visitor)C++設計模式
- 設計模式 --建類神器之建造者模式設計模式
- 如何使用RedisTemplate訪問Redis資料結構Redis資料結構
- 設計模式(五)Builder構建者模式設計模式UI
- JDBC資料庫訪問JDBC資料庫
- 15.java設計模式之訪問者模式Java設計模式
- 設計模式(二十三)訪問者設計模式
- 使用 Repository 設計模式封裝通用的 CURD設計模式封裝
- 南大通用GBase資料庫完成生態建設30連擊資料庫
- 通用許可權系統之資料庫表設計資料庫
- 【資料庫設計】資料庫的設計資料庫
- Class:向傳統類模式轉變的建構函式模式函式
- 外網訪問MySQL資料庫MySql資料庫
- Oracle資料庫限制訪問IPOracle資料庫
- 「補課」進行時:設計模式(18)——訪問者模式設計模式
- Android理解設計模式之組合模式、迭代器模式、訪問者模式Android設計模式
- [開源] .Net 使用 ORM 訪問 華為GaussDB資料庫ORM資料庫
- Spring Boot入門(五):使用JDBC訪問MySql資料庫Spring BootJDBCMySql資料庫
- Serverless 解惑——函式計算如何訪問 Redis 資料庫Server函式Redis資料庫
- Serverless 解惑——函式計算如何訪問 Mongo 資料庫Server函式Go資料庫
- Serverless 解惑——函式計算如何訪問 MySQL 資料庫Server函式MySql資料庫
- Serverless 解惑——函式計算如何訪問 PostgreSQL 資料庫Server函式SQL資料庫
- 讀資料工程之道:設計和構建健壯的資料系統27轉換
- 架構設計(二):資料庫複製架構資料庫
- 設計模式使用例項(5)——建造者模式例項之資料庫連線管理設計模式資料庫
- 如何使用 Node.js 訪問 SAP HANA Cloud 資料庫裡的資料Node.jsCloud資料庫