使用動(dòng)態(tài)數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象
導(dǎo)讀:使用動(dòng)態(tài)數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象很大程度簡(jiǎn)化了我們的操作,為了使我的介紹更形象化,也易于大家理解,下文中我將通過(guò)一些實(shí)例簡(jiǎn)單的介紹下這種方法。
前兩天看到Warp framework的介紹,它基于Google Guice,是一個(gè)輕量級(jí)的web開(kāi)發(fā)框架。它的Dynamic finder特性實(shí)在讓人興奮,代碼非常簡(jiǎn)單,支持注入,大大簡(jiǎn)化了DAO層的開(kāi)發(fā)。下面看看它的幾個(gè)例子吧:
@Finder(query="from Person")
public List<Person> listAll() { return null; }
@Finder(query="from Person where firstName = :firstName")
Person find(@Named("firstName") String name);
還有更簡(jiǎn)單的嗎
在以往的開(kāi)發(fā)過(guò)程中,為了層次清晰,易于測(cè)試,通常會(huì)將業(yè)務(wù)邏輯層和數(shù)據(jù)庫(kù)訪問(wèn)層分開(kāi)。看下面的例子
public class UserService
{
public UserService(IUserDAO userDAO){}
}
為什么要這樣做呢?
好處是:
1. userDAO能夠依賴注入,使用IOC框架管理
2. 對(duì)UserService進(jìn)行單元測(cè)試,userDAO使用mock工具創(chuàng)建,這樣避免了要單元測(cè)試還得生成真實(shí)數(shù)據(jù)的問(wèn)題。
但是這樣就產(chǎn)生了一個(gè)問(wèn)題,大部分?jǐn)?shù)據(jù)表都會(huì)有這么一個(gè)DAO對(duì)象存在,使得DAO層過(guò)于龐大。當(dāng)然如果使用泛型的DAO或者抽象出基類(lèi)就能使代碼量減少,這樣也不能解決根本問(wèn)題。Warp提出的Dynamic finder,讓人著實(shí)興奮。自己根本就不需要逐個(gè)DAO去實(shí)現(xiàn),只需要方法聲明+annotation。
這么好的想法怎么能不采用呢。 于是我花了幾個(gè)小時(shí)試著用C#來(lái)實(shí)現(xiàn),并且結(jié)合了Linq To Sql。如果直接使用SqlCommand來(lái)操作數(shù)據(jù)庫(kù)填充實(shí)體,實(shí)現(xiàn)起來(lái)會(huì)更加簡(jiǎn)單,現(xiàn)在用Linq To Sql的人越來(lái)越多,就結(jié)合著來(lái)寫(xiě)的。結(jié)果還不錯(cuò),代碼看著的確簡(jiǎn)潔了很多,就是接口+Attribute。我使用的數(shù)據(jù)庫(kù)是Northwind。Customer是Linq To Sql生成出來(lái)的,EntityType是用來(lái)標(biāo)識(shí)對(duì)那個(gè)實(shí)體類(lèi)進(jìn)行操作,F(xiàn)ind用來(lái)標(biāo)識(shí)根據(jù)主鍵查找對(duì)象的方法,Delete表示是刪除一個(gè)實(shí)體,Create表示創(chuàng)建一個(gè)實(shí)體。Query表示自定義的查詢字符串,現(xiàn)在只是最簡(jiǎn)單實(shí)現(xiàn),以后可以提供更復(fù)雜的查詢條件和寫(xiě)法。
[DomainType(typeof(Customer))]
public interface ICustomDAO
從上文可以總結(jié)出使用動(dòng)態(tài)數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象好處還是很多的,希望大家通過(guò)本次的學(xué)習(xí),能夠掌握這種技巧,這樣就能為對(duì)大家以后的工作帶來(lái)種種益處,大家何樂(lè)而不為呢?
【編輯推薦】
- 混合數(shù)據(jù)庫(kù)時(shí)代何日降臨
- 確保數(shù)據(jù)庫(kù)安全的三大法寶
- 數(shù)據(jù)庫(kù)營(yíng)銷(xiāo)是否變身超級(jí)營(yíng)銷(xiāo)工具
- 國(guó)產(chǎn)數(shù)據(jù)庫(kù)的艱難長(zhǎng)征路

















