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