关于数据访问模式(三)—— Data Accessor模式
??????? 拐彎抹角了兩篇Post,說了一下重要性和很常見的一個詞匯:Metadata,終于都到言歸正傳的時候了。今天我們先來看看數據訪問模式當中使用得很頻繁的一種模式——Data Accessor(也稱為DAO,數據訪問器)。
??????? 不管你是用著ADO.NET還是JDBC,你都可以直接使用SQL(在ADO.NET中使用SqlCommand,JDBC則是使用Statement)去訪問數據庫。而且,在使用SQL之前,你還得建立與數據庫的連接(Connection)。于是,像這些涉及數據訪問的代碼就會散布在應用程序當中,使得程序維護或是性能改善都難以實施。舉個很簡單的例子,如果在一個項目中,每個程序員都要自己去建立與數據庫的連接,那么當你希望實現一個連接池(Connection Pool)以提高性能的時候,散布在應用程序各處的建立連接的代碼就會令你疲于奔命。因為在這種緊密耦合的情況下,連接池的使用改變了建立連接的方式,從而導致大量的代碼改動。為了能夠讓應用程序更具靈活性,我們通常都會采用一些策略來降低應用程序與數據庫訪問細節之間的耦合度。Data Accessor就是這些解耦合的策略相當重要的一條。
??????? Data Accessor的實質就是封裝了對數據庫訪問的細節,僅對應用程序公開邏輯操作。Data Accessor封裝細節的程度也就決定了其實現的復雜程度。最簡單的一種Data Accessor實現就是由一個Support類提供通用的獲得連接的方法,然后進行數據操作的類都必須擴展這個Support類。具體代碼如下所示:
????public?final?Connection?getConnection()?{
???????????????//?獲得連接???????
?????}
????public?final?void?releaseConnection(Connection?conn)?{??????
???????????????//?釋放連接
?????}
}?
public?class?UserDAO?extends?DAOSupport?{
????private?Connection?conn?=?getConnection();
????????
}
在以上的代碼中,DAOSupport+UserDAO類就可以看作是一個Data Accessor,雖然僅僅是對獲得和釋放Connection的細節進行了封裝,但是這樣簡單的分離都會令整個開發過程受益匪淺。
??????? 上面的例子雖然實現了最簡單的Data Accessor,但是事實上這樣的Data Accessor還是太簡陋了(原始社會的產品),畢竟你在UserDAO中操作數據表的話,還是得寫SQL。好了,為了讓這個Data Accessor更加名副其實,我們還要做進一步的抽象。通常對數據庫表進行的操作不外乎CRUD,所以我們就可以在DAOSupport中增加相應的四個方法[1]:
public?void?insert(String?table,?List?rows)?throws?SQLException;
public?void?update(String?table,?Row?selectedRow,?Row?updateRow)?throws?SQLException;
public?void?delete(String?table,?Row?selectedRow)?throws?SQLException;
?其中Row是一個輔助類,用于表示數據庫中的一行中的所有列或者某幾列數據,可以通過一個HashMap來實現。上面定義的幾個方法,實質上是要在方法體中實現SQL的自動構造,具體的實現就不在這里贅述了,有興趣的朋友可以參考《數據訪問模式——面向對象應用中的數據庫交互》一書。 在增加了這四個方法之后,UserDAO中涉及數據訪問的代碼都可以通過調用這四個方法來完成了,完全脫離了具體的數據訪問細節。當你為了優化查詢的方法而修改read方法的時候,修改就會影響到所有的*DAO類,一處修改,處處受益。
??????? 雖然我們通過抽象而建立起來的四個方法可以讓我們逃避了SQL的困擾,但并非一勞永逸。細心的你一定會發現,read方法的參數僅是表名和列名,這樣返回的紀錄集將會是數據表中的所有行,因此,我們還是得增加一個參數,使得read方法更加實用。于是read方法就變成了這樣:
在增加了conditions這樣參數以后,read方法可以根據條件的界定獲得相應的某一行了。功能增加了,隨之而來的就是方法復雜度的增加,抽象過程也顯得愈加困難??傊?#xff0c;Data Accessor最關鍵的在于邏輯操作的抽象,復雜度與功能之間的均衡。
[1] 代碼參考了《數據訪問模式——面向對象應用中的數據庫交互》
總結
以上是生活随笔為你收集整理的关于数据访问模式(三)—— Data Accessor模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将maven项目打包成可执行的jar
- 下一篇: 架构设计基础:单服务.集群.分布式,基本