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