摘要:J2EE模型提供了一個很好的企業(yè)應(yīng)用框架及解決方法,提供了靈活的技術(shù)選擇,由于所有的J2EE應(yīng)用都需要訪問持久性數(shù)據(jù)資源,因此實(shí)現(xiàn)和封裝J2EE數(shù)據(jù)訪問層越來越成為構(gòu)建穩(wěn)定、健壯和靈活的J2EE應(yīng)用的基礎(chǔ)。論文重點(diǎn)介紹了如何使用DAO模式來解決數(shù)據(jù)訪問客戶端對持久性存儲的問題,并給出了一種解決DAO模式對象類型依賴問題的方法。
關(guān)鍵詞:數(shù)據(jù)訪問對象(DAO); J2EE; Enterprise JavaBean (EJB)
1引言
隨著軟件系統(tǒng)的規(guī)模和復(fù)雜性的增加,人們希望將設(shè)計模式的思想應(yīng)用于基于J2EE的企業(yè)信息化系統(tǒng)中,使開發(fā)者減少在J2EE平臺開發(fā)過程中的重復(fù)投資,這樣不僅會大幅度的減少開發(fā)的工作量,也會為以后整個系統(tǒng)的維護(hù)和升級打下一個堅實(shí)的基礎(chǔ)。本文主要介紹設(shè)計模式和其中的DAO(數(shù)據(jù)訪問對象)模式的概念及功能,探討DAO模式在哈爾濱塑料五廠企業(yè)信息化系統(tǒng)中的應(yīng)用。
2設(shè)計模式概述
設(shè)計模式是指情景中標(biāo)準(zhǔn)設(shè)計問題的重復(fù)性解決方案,它關(guān)注的是特定設(shè)計問題及其解決方案。在每種模式中均描述一個設(shè)計問題和一個通用的經(jīng)過驗(yàn)證的解決方案。這個解決方案是對反復(fù)出現(xiàn)的設(shè)計結(jié)構(gòu)進(jìn)行識別和抽象得到的,它通常由多個類組成。在軟件系統(tǒng)的設(shè)計中,設(shè)計模式使代碼編寫真正工程化,為軟件系統(tǒng)的設(shè)計帶來諸多好處。
3 DAO設(shè)計模式
J2EE平臺是開發(fā)和運(yùn)行企業(yè)級Web應(yīng)用的標(biāo)準(zhǔn),可以用于開發(fā)大型的、多層次的以及分布式的企業(yè)級Web應(yīng)用系統(tǒng)。J2EE技術(shù)為組件開發(fā)提供了廣泛的支持,同時也提供了豐富的開發(fā)工具和服務(wù),便于開發(fā)模塊化的,可重用的業(yè)務(wù)邏輯。
EJB (企業(yè)級Java Bean)的設(shè)計是J2EE應(yīng)用設(shè)計中的核心模塊。目前,EJB的設(shè)計模式有幾十種,如何選擇適合自己項(xiàng)目的模式是EJB設(shè)計的關(guān)鍵問題,也是最難解決的問題。
3.1 DAO模式介紹
DAO簡單的說就是對持久化層的訪問路徑,客戶端得到一個DAO對象,由DAO對象訪問數(shù)據(jù)源,數(shù)據(jù)源創(chuàng)建結(jié)果集并將它返回給DAO對象,DAO對象根據(jù)結(jié)果集創(chuàng)造出數(shù)據(jù)對象并返回客戶端。這些元素之間的動態(tài)協(xié)作過程是由該模式以下幾部分完成的:
DAO (DataAccessObject)是該模式的主要對象,它封裝了底層數(shù)據(jù)訪問實(shí)現(xiàn),以保證對數(shù)據(jù)源的透明訪問。用戶可以把數(shù)據(jù)加載和存儲操作委托給數(shù)據(jù)庫訪問對象。
數(shù)據(jù)源(DataSource)代表數(shù)據(jù)源實(shí)現(xiàn)。數(shù)據(jù)源可以是RDBMS, OODBMS,XM L資料庫、純文件系統(tǒng)等等。
結(jié)果集(ResultSet)是DAO對象訪問數(shù)據(jù)源得到的結(jié)果的集合,DAO可以用結(jié)果集包裝成數(shù)據(jù)對象。
客戶端(Client)使用數(shù)據(jù)對象進(jìn)行商業(yè)邏輯。
數(shù)據(jù)對象(Data Object)是數(shù)據(jù)以對象的形式描述。它由DAO對象創(chuàng)建,然后給客戶端進(jìn)行商業(yè)邏輯運(yùn)算。
3.2 DAO模式的優(yōu)點(diǎn)
對持久化數(shù)據(jù)的訪問有良好的透明性,業(yè)務(wù)對象可以在不知道數(shù)據(jù)源實(shí)現(xiàn)細(xì)節(jié)的情況下訪問數(shù)據(jù)。由于一切數(shù)據(jù)訪問細(xì)節(jié)被數(shù)據(jù)訪問對象所隱藏,所以這種訪問過程是透明的。
數(shù)據(jù)庫有良好的可移植性。在應(yīng)用系統(tǒng)中添加數(shù)據(jù)訪問對象,可以使得應(yīng)用系統(tǒng)能夠很方便地移植到另外一種數(shù)據(jù)庫實(shí)現(xiàn)上。由于業(yè)務(wù)對象與數(shù)據(jù)實(shí)現(xiàn)是隔離的,所以在移植過程中,僅僅對數(shù)據(jù)訪問對象進(jìn)行一些變化即可。
可以減少業(yè)務(wù)對象的代碼復(fù)雜度。由于數(shù)據(jù)訪問對象可以管理所有的數(shù)據(jù)訪問細(xì)節(jié),這就簡化了業(yè)務(wù)模塊和其它數(shù)據(jù)客戶的代碼,同時也提高了應(yīng)用系統(tǒng)的整體可讀性和開發(fā)效率。
可以對數(shù)據(jù)訪問進(jìn)行集中處理。由于所有的數(shù)據(jù)訪問操作都移交給數(shù)據(jù)訪問對象,這樣應(yīng)用系統(tǒng)其它部分就與數(shù)據(jù)訪問隔離開來,而全部相關(guān)操作都由數(shù)據(jù)訪問對象集中處理,這樣也使得相關(guān)操作更加容易被維護(hù)和管理。
為了進(jìn)一步說明DAO模式的優(yōu)勢,下面以一個企業(yè)信息化系統(tǒng)為例,介紹如何在具體的項(xiàng)目中運(yùn)用DAO模式。
3.3 DAO模式的應(yīng)用
哈工大塑料五廠的企業(yè)信息化系統(tǒng)包括成本查詢模塊、生產(chǎn)管理模塊、系統(tǒng)定義模塊、OA管理模塊、客戶關(guān)系管理模塊,現(xiàn)在以生產(chǎn)管理模塊來說明DAO模式的應(yīng)用。
生產(chǎn)管理模塊的流程是:用戶首先要根據(jù)銷售計劃查看庫存情況,然后制定生產(chǎn)計劃,交由生產(chǎn)經(jīng)理審批,批準(zhǔn)后由研發(fā)部確定最佳的工藝參數(shù),編制作業(yè)指導(dǎo)書,再交由生產(chǎn)經(jīng)理審批并實(shí)施以保證產(chǎn)品質(zhì)量。如果生產(chǎn)過程中條件發(fā)生變化,要重新進(jìn)行以上流程。
Client是客戶端,可以訪問數(shù)據(jù)源以存取數(shù)據(jù)。DataAccessObject對Client隱藏了底層的數(shù)據(jù)訪問細(xì)節(jié),使Client能透明地訪問數(shù)據(jù)源,實(shí)現(xiàn)創(chuàng)建、查找、更新和刪除等操作。DataSource代表JDBC數(shù)據(jù)源的實(shí)現(xiàn)。Data代表一個傳輸對象,它被用作數(shù)據(jù)的載體,DAO可以將數(shù)據(jù)返回給客戶端,也可以從客戶端那里接收傳輸對象形式的數(shù)據(jù),并用這些數(shù)據(jù)對數(shù)據(jù)源進(jìn)行更新。ResultSet代表一次查詢操作的結(jié)果。
用戶進(jìn)入生產(chǎn)管理子系統(tǒng)后,通過ResultSet返回的結(jié)果集查看庫存情況,再對照銷售計劃制定生產(chǎn)計劃,DataAccessObject提供在數(shù)據(jù)庫中創(chuàng)建、查找、更新和刪除Data的操作,不對任何查詢操作進(jìn)行緩存,因此不會出現(xiàn)線程或同步問題的干擾,而且DAO將數(shù)據(jù)源的實(shí)現(xiàn)細(xì)節(jié)完全隱藏起來,不必?fù)?dān)心數(shù)據(jù)源對使用者的接口的影響。當(dāng)應(yīng)用程序使用JDBC作為持久化手段時,DAO將所有對JDBC的使用都封裝在數(shù)據(jù)訪問層內(nèi)部,不會向數(shù)據(jù)訪問層之外的客戶端暴露任何屬于java.sql.*或java.x.sql.*包的異常。因此,數(shù)據(jù)訪問及操作的邏輯被封裝在了一個單獨(dú)的層次中,起到了把中間層分為兩部分的作用。
結(jié)束語
DAO模式是一種讓很多開發(fā)者都受益匪淺的功能強(qiáng)大的EJB設(shè)計模式。實(shí)踐證明,在EJB的設(shè)計中,適當(dāng)?shù)氖褂肈AO模式,不但可以使代碼可重用性、可拓展性增強(qiáng),而且還能夠提高效率。當(dāng)然,DAO模式并不是在所有的項(xiàng)目中都適用,如果使用不當(dāng),反而會造成系統(tǒng)性能的下降。比如,設(shè)計該模式時增加額外的類會提高應(yīng)用程序的復(fù)雜度,對于容器管理的持久性不能利用,降低了開發(fā)效率。因此,DAO模式在許多方面還需要我們進(jìn)一步探討、改進(jìn)和擴(kuò)展。
參考文獻(xiàn)
[1] Deepak Alur,John Crupi,Dan Malks.Core J2EE Paterns:Best Practices and Design Strategies[M].Second Edition,Prentice Hall ,2003:10-233.
[2] Ted Husted, Cedric Dumoulin, Georgeranciscus.Struts in action[M].Manning Publications Co,2003:56-60.
[3] 鄭人杰,殷人昆,陶永雷.實(shí)用軟件工程[M].北京:清華大學(xué)出版社,1997:45-48。
[4] 泰勒(美),李東升.JDBC數(shù)據(jù)庫編程與J2EE[M].北京:電子工業(yè)出版社,2004:23-67。