自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

J2EE之DAO設(shè)計(jì)模式簡(jiǎn)介與實(shí)例

開發(fā) 后端
最近參與WEB編程項(xiàng)目,采用STRUTS框架,在處理到數(shù)據(jù)持久化的時(shí)候決定采用DAO設(shè)計(jì)模式,因此讀了SUN的J2EE 核心設(shè)計(jì)模式中DAO設(shè)計(jì)模式,現(xiàn)翻譯為中文于大家共享,不足與錯(cuò)誤指出望大家指出,也愿該文對(duì)大家有所幫助.

在JAVA編程的時(shí)候, 有時(shí)候看起來非常直接的實(shí)現(xiàn)卻非要用設(shè)計(jì)模式轉(zhuǎn)若干個(gè)彎去實(shí)現(xiàn)他, 這似乎顯的很多余,但是采用一些成熟的設(shè)計(jì)模式,會(huì)使程序更加的健壯,松耦合以及好維護(hù)和擴(kuò)展. 

DAO 設(shè)計(jì)模式

背景:
根據(jù)數(shù)據(jù)源的不同,訪問數(shù)據(jù)的方法也會(huì)有所不同,訪問持久化的數(shù)據(jù)源,比如數(shù)據(jù)庫,也會(huì)由于其存儲(chǔ)類型的不同(關(guān)系數(shù)據(jù)庫,面向?qū)ο蟮臄?shù)據(jù)庫,簡(jiǎn)單文件儲(chǔ)存,其他方式)和提供商自定義數(shù)據(jù)類型的不同而有很大的區(qū)別。

出現(xiàn)的問題:
許 多投入使用的,J2EE WEB 應(yīng)用程序在一些時(shí)候需要進(jìn)行數(shù)據(jù)的持久化. 對(duì)于很多的WEB應(yīng)用,數(shù)據(jù)的持久化存儲(chǔ)可以通過不同的機(jī)制來實(shí)現(xiàn),文檔中 清楚的標(biāo)出了這些用于訪問不同數(shù)據(jù)持久機(jī)制的API的不同之處. 還有一些其他的應(yīng)用或許會(huì)訪問一些位于特有系統(tǒng)上的數(shù)據(jù)資源.比如,在大型機(jī)的系統(tǒng)之 上,也可能在輕量級(jí)的目錄訪問協(xié)議LDAP倉庫中,或者是其他什么系統(tǒng). 還有就是,數(shù)據(jù)也可能是由諸如B2B這樣的外部集成系統(tǒng)服務(wù),信用卡局服務(wù),或 者其他服務(wù)來提供的.一般來說,程序使用一些共享的分布式組件來表示持久化數(shù)據(jù).比如實(shí)體BEAN. 當(dāng)一個(gè)程序中實(shí)體BEAN以比較直接的方式訪問持久 化數(shù)據(jù)時(shí)大多會(huì)考慮采用BEAN管理持久化方式(BMP)說明白點(diǎn),就是程序中的實(shí)體BEAN包含有直接訪問持久化數(shù)據(jù)的代碼.另外一種情況,程序可以采 用容器管理持久化,你不需要寫任何代碼,而是讓容器自己來處理數(shù)據(jù)持久化的具體細(xì)節(jié).

程序可以使用JDBC API 來訪問位于關(guān)系數(shù)據(jù) 庫中的數(shù)據(jù). 他使得在諸如關(guān)系型數(shù)據(jù)庫這樣的持久化載體中,對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)的訪問和處理成為可能. 也使J2EE應(yīng)用程序可以使用SQL語句作為標(biāo)準(zhǔn)的 訪問關(guān)系型數(shù)據(jù)庫語句. 然而,即便是都是關(guān)系型數(shù)據(jù)庫的環(huán)境下,由于不同的數(shù)據(jù)庫產(chǎn)品,也會(huì)導(dǎo)致SQL在使用上,語法和格式也各不相同.

對(duì) 于不同類型的數(shù)據(jù)持久化倉庫,差異甚至?xí)? 訪問機(jī)制,API,以及一些其他特性,會(huì)因?yàn)樗麄兪顷P(guān)系型數(shù)據(jù)庫,面向?qū)ο笮蛿?shù)據(jù)庫還是一般的文件而大相 徑庭.需要訪問以前遺留下來的系統(tǒng)或者諸如大型主機(jī),B2B這樣的專業(yè)系統(tǒng)中數(shù)據(jù)庫的應(yīng)用程序,會(huì)經(jīng)常使用到一些自己特有的API. 這些特有的數(shù)據(jù)源對(duì) 應(yīng)用程序的編寫提出了很大的挑戰(zhàn),而且很有可能在編寫的過程中造成程序代碼和數(shù)據(jù)訪問代碼間產(chǎn)生相互依賴性.當(dāng)商業(yè)組件諸如:實(shí)體BEAN,會(huì)話 BEAN,以及servlets和JSP幫助對(duì)象這樣的表示組件需要訪問數(shù)據(jù)資源的時(shí)候,可以用標(biāo)準(zhǔn)的API來實(shí)現(xiàn)其數(shù)據(jù)庫的連接和數(shù)據(jù)的具體操作.但 是,如果把連接數(shù)據(jù)庫和數(shù)據(jù)的操作代碼和這些組件寫在一起的話,會(huì)導(dǎo)致這些組件和數(shù)據(jù)庫操作之間的耦合,這種耦合的存在,使得在應(yīng)用程序中從當(dāng)前數(shù)據(jù)源類 型遷移到另一種數(shù)據(jù)源類型變的十分困難和乏味. 如果數(shù)據(jù)源改變了,那么你的組件也不得不改變來適應(yīng)新的數(shù)據(jù)源.

必要性:
1 像 bean管理實(shí)體bean, 會(huì)話 bean, servlets, 以及其他一些像jsp幫手對(duì)象這樣的組件,通常需要從持久化的數(shù)據(jù)庫或者原先遺留下來的系統(tǒng)以及 B2B, LDAP這樣的系統(tǒng)中提取或存儲(chǔ)數(shù)據(jù)。

2 用 于持久化儲(chǔ)存的API因他們的提供商的不同而各自不同。還有一些的數(shù)據(jù)源也可能有自己的一些特有的API或者是一些非標(biāo)準(zhǔn)的API。眾多類型的數(shù)據(jù)持久化 系統(tǒng)和載體,比如: 關(guān)系型數(shù)據(jù)庫,面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng),XML文檔,簡(jiǎn)單文件等等,使得API各不相同和性能各異。我們?nèi)狈σ环N統(tǒng)一的API來對(duì)以 上的不同的系統(tǒng)或者文件載體進(jìn)行操作。

3 組件通常使用特有的API從內(nèi)部系統(tǒng)或者是遺留下來的系統(tǒng)來訪問或是提取數(shù)據(jù)。

4 當(dāng)某些特定的訪問機(jī)制和API包含在這些組件中的時(shí)候,將直接影響他們的兼容性。

5 組件需要對(duì)現(xiàn)有的持久化儲(chǔ)存系統(tǒng)或者數(shù)據(jù)源的實(shí)現(xiàn)足夠透明,以便在向不同的產(chǎn)品,不同類型的儲(chǔ)存系統(tǒng),和不同類型數(shù)據(jù)源中進(jìn)行遷移的時(shí)候,變的簡(jiǎn)單。

解決方案
使用數(shù)據(jù)訪問對(duì)象來抽象和封裝對(duì)數(shù)據(jù)源的所有訪問。數(shù)據(jù)訪問對(duì)象負(fù)責(zé)管理與數(shù)據(jù)源的連接,來獲取和儲(chǔ)存其中的數(shù)據(jù)。

數(shù) 據(jù)訪問對(duì)象實(shí)現(xiàn)與數(shù)據(jù)源相關(guān)的訪問機(jī)制。 數(shù)據(jù)源可以是關(guān)系型數(shù)據(jù)庫管理系統(tǒng),可以是像B2B EXCHANGE這樣的內(nèi)部服務(wù),可以是LDAP庫,或者 也可以是通過CORBA IIOP 或者是低層sockets來訪問的商業(yè)服務(wù). 依賴于DAO的商業(yè)組件只對(duì)他的客戶端暴露一些非常簡(jiǎn)單的DAO外部接 口. DAO將數(shù)據(jù)源的實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶端完全的隱藏了起來. 因?yàn)?暴露給客戶端的DAO接口在低層數(shù)據(jù)源的實(shí)現(xiàn)發(fā)生改變時(shí)并不會(huì)隨著改變,所以這種設(shè)計(jì) 模式使得DAO可以適應(yīng)不同的數(shù)據(jù)儲(chǔ)存方式類型而不影響客戶端和商業(yè)組件.最主要的, DAO還在組件和數(shù)據(jù)源之間扮演著協(xié)調(diào)者的角色.


以下是DAO設(shè)計(jì)模式中各個(gè)模塊的解釋:

1 BusinessObject指的是數(shù)據(jù)客戶端,他通常需要去訪問數(shù)據(jù)源以獲得數(shù)據(jù)或儲(chǔ)存數(shù)據(jù).一個(gè)BusinessObject除了訪問數(shù)據(jù)源的servlet或者h(yuǎn)elper bean之外也可以是會(huì)話BEAN,實(shí)體BEAN以及一些其他的JAVA對(duì)象.

2 DataAccessObject 是 這個(gè)設(shè)計(jì)模式的核心部分, DataAccessObject為BusinessObject抽象了底層的數(shù)據(jù)訪問實(shí)現(xiàn)的細(xì)節(jié),使得訪問數(shù)據(jù)變得透 明. BusinessObject還將數(shù)據(jù)的裝載和儲(chǔ)存交給了DataAccessObject進(jìn)行代理.

3 DataSource他 表示的是數(shù)據(jù)源的實(shí)現(xiàn). 一個(gè)數(shù)據(jù)源可以四像關(guān)系型數(shù)據(jù)庫管理體統(tǒng)這樣的數(shù)據(jù)庫,可以是面向?qū)ο笮偷臄?shù)據(jù)庫管理系統(tǒng),可以是XML文檔,也可以是簡(jiǎn)單文件 等等. 當(dāng)然他也可以是其他的系統(tǒng),(遺留系統(tǒng),大型主機(jī)),可以是服務(wù)(B2B服務(wù),信用卡局服務(wù))或者是像LDAP這樣的數(shù)據(jù)庫等.

4 TransferObject他代表的是傳遞對(duì)象,一般用于數(shù)據(jù)的載體. DataAccessObject使用傳遞對(duì)象來將數(shù)據(jù)返回給客戶端. DataAccessObject也可以使用傳遞對(duì)象來從客戶端接受數(shù)據(jù)來將原先數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行更新.

策略:
由 于每一個(gè)BusinessObject都有著相應(yīng)的DAO,所以在BusinessObject,DAO,和底層實(shí)現(xiàn)之間是可以建立起確定的關(guān)系的(比如 在關(guān)系型數(shù)據(jù)庫中的表格)。一旦他們之間的關(guān)系建立了,我們就可以為這個(gè)應(yīng)用使用專門定制出代碼生成器生成涉及到該應(yīng)用所有的DAO的代碼。產(chǎn)生DAO的 元數(shù)據(jù)還可以通過開發(fā)人員定制的描述符文件來獲得.代碼生成器也可以通過自動(dòng)的對(duì)數(shù)據(jù)庫進(jìn)行檢查,然后按照實(shí)際情況來提供一些必要的DAO來訪問數(shù)據(jù) 庫. 如果對(duì)于DAO的要求過于復(fù)雜,則考慮使用第三方工具來為關(guān)系型數(shù)據(jù)庫提供對(duì)象到關(guān)系的映射.這些工具一般都包含圖形化的用戶界面可以方便的將商業(yè) 對(duì)象影射到持久化對(duì)象上,于是就可以定義DAO了。這些工具可以自動(dòng)在影射一結(jié)束就自動(dòng)的產(chǎn)生代碼,不但如此,他門可以提供一些附加的好處,比如結(jié)果緩 存,查詢緩存,與應(yīng)用服務(wù)器的整合,于第三方產(chǎn)品的整和(分布試緩存)等等.

1 工廠模式策略:
DAO設(shè)計(jì)模式可以通過采用抽象工廠和工廠方法模式來邊的非常的靈活.

當(dāng)?shù)讓訑?shù)據(jù)儲(chǔ)存實(shí)現(xiàn)不需要發(fā)生改變時(shí),該策略可以使用工廠方法設(shè)計(jì)模式實(shí)現(xiàn),來產(chǎn)生應(yīng)用中所需的DAO.

當(dāng) 底層數(shù)據(jù)儲(chǔ)存實(shí)現(xiàn)不得不發(fā)生變化的時(shí)候, 我們可以用抽象工廠模式來實(shí)現(xiàn)這個(gè)策略. 就象在設(shè)計(jì)模式:可重用面向?qū)ο筌浖脑剡@本書中建議的那樣,抽象 工廠先創(chuàng)建然后再使用工廠方法的實(shí)現(xiàn). 在當(dāng)前情況,該策略可以提供一個(gè)抽象的DAO工廠對(duì)象(抽象工廠),用他來創(chuàng)建不同類型的具體DAO工廠.,每一 個(gè)工廠都各自支持一種不同的數(shù)據(jù)持久化儲(chǔ)存的實(shí)現(xiàn). 一旦你為某個(gè)特定的實(shí)現(xiàn)獲得了具體的DAO工廠,你則可以用這個(gè)工廠來產(chǎn)生那個(gè)特定實(shí)現(xiàn)所支持和實(shí)現(xiàn) 的DAO對(duì)象.

優(yōu)點(diǎn)與缺點(diǎn):
DAO設(shè)計(jì)模式帶來的好處.

1 透明化:
商業(yè)對(duì)象可以在完全不知道數(shù)據(jù)源如何具體實(shí)現(xiàn)的情況下來使用數(shù)據(jù)源. 訪問數(shù)據(jù)源是透明的,因?yàn)閷?shí)現(xiàn)細(xì)節(jié)已經(jīng)被隱藏進(jìn)了DAO.

2 遷移簡(jiǎn)單化:
DAO 層的出現(xiàn),使得應(yīng)用程序向不同的數(shù)據(jù)庫實(shí)現(xiàn)進(jìn)行遷移變的容易.商業(yè)對(duì)象可以對(duì)底層數(shù)據(jù)實(shí)現(xiàn)一無所知.這樣,遷移只涉及到了對(duì)DAO層的修改. 另外,如果 使用工廠策略,則使為每一種底層數(shù)據(jù)實(shí)現(xiàn)提供一個(gè)具體的工廠實(shí)現(xiàn)成為可能.在這種情況下,遷移到一種不同的數(shù)據(jù)實(shí)現(xiàn),其實(shí)就相當(dāng)于為這個(gè)應(yīng)用程序再提供一 個(gè)新的工廠實(shí)現(xiàn).

3 減少在商業(yè)對(duì)象中的編程難度.
由于DAO管理著所有的數(shù)據(jù)訪問細(xì)節(jié),因而大大簡(jiǎn)化了在商業(yè)對(duì)象和其他使用DAO的數(shù)據(jù)客戶端里的代碼.所有的實(shí)現(xiàn)細(xì)節(jié)相關(guān)的代碼比如(SQL 語句)都包含在DAO而不在商業(yè)對(duì)象中. 這樣使得代碼變的更加健壯而且大大提高了開發(fā)效率.

4 將所有的數(shù)據(jù)訪問都單獨(dú)集中到一層中去.
因?yàn)樗械臄?shù)據(jù)訪問操作現(xiàn)在都已經(jīng)被DAO所代理,所以這個(gè)單獨(dú)的數(shù)據(jù)訪問層可以被看作可以是將數(shù)據(jù)訪問實(shí)現(xiàn)和其余應(yīng)用程序相互隔離的一層. 這樣的集中,使得應(yīng)用程序可以更加容易的來維護(hù)和管理.

缺點(diǎn):
5 對(duì)容器管理持久化無用
由 于EJB容器使用CMP(容器管理持久化)來管理實(shí)體BEAN. 容器會(huì)自動(dòng)的為持久化儲(chǔ)存訪問提供服務(wù).應(yīng)用程序使用容器管理的實(shí)體BEAN則不需要 DAO層的參與.因?yàn)閼?yīng)用程序服務(wù)器本身就可以透明的提供這些功能.然而,DAO在組合式CMP和BMP需要的場(chǎng)合下還是有用的.

6 增加了多余的層.
由于DAO在數(shù)據(jù)客戶端和數(shù)據(jù)源之外多創(chuàng)建了一層對(duì)象,因而,需要對(duì)他進(jìn)行設(shè)計(jì)和實(shí)現(xiàn),來均衡這個(gè)設(shè)計(jì)模式的利弊. 但是,一般來說,采用此設(shè)計(jì)模式還是利大于弊的.

7 需要對(duì)類的相互繼承關(guān)系進(jìn)行設(shè)計(jì).
當(dāng) 使用工廠策略的時(shí)候,具體工廠類的繼承關(guān)系和由這些工廠類生成的產(chǎn)品需要進(jìn)行設(shè)計(jì)和實(shí)現(xiàn). 我們需要仔細(xì)考慮這些多付出的工作是否真的可以產(chǎn)生出來更高的 靈活性. 使用這個(gè)策略會(huì)使設(shè)計(jì)變的更加復(fù)雜,然而,你可以先從工廠方法模式開始來實(shí)現(xiàn)這個(gè)策略,然后在需要的情況下再轉(zhuǎn)向抽象工廠

范例說明:

為DAO實(shí)現(xiàn)工廠類的策略

1 采用工廠方法設(shè)計(jì)模式
如果一個(gè)DAO 工廠只為一個(gè)數(shù)據(jù)庫的實(shí)現(xiàn),(比如ORACLE)而創(chuàng)建很多的DAO的時(shí)候,實(shí)現(xiàn)該策略時(shí),我們考慮采用工廠方法設(shè)計(jì)模式. 假設(shè)該工廠類創(chuàng)建了CustomerDAO, AccountDAO, OrderDAO 等一些對(duì)象。

2 使用抽象工廠設(shè)計(jì)模式:

如果考慮為三種不同類型的數(shù)據(jù)庫來實(shí)現(xiàn)這個(gè)策略,我們可以考慮采用抽象工廠設(shè)計(jì)模式. 假設(shè). 這個(gè)工廠創(chuàng)建了CustomerDAO, AccountDAO, OrderDAO的一系列的DAO, 該策略運(yùn)用了在抽象工廠中產(chǎn)生的工廠類中的工廠方法的實(shí)現(xiàn).

代碼說明:

以下代碼舉例說明了DAO設(shè)計(jì)模式的具體實(shí)現(xiàn):
我們以使用抽象工廠的設(shè)計(jì)模式來對(duì)付多種類型數(shù)據(jù)庫為例,在以下的例子中只具體列出CLOUDSCAPE 數(shù)據(jù)庫類型的DAO設(shè)計(jì)模式的具體實(shí)現(xiàn),其他類型數(shù)據(jù)庫DAO設(shè)計(jì)模式的實(shí)現(xiàn)大同小異.

  1. // Abstract class DAO Factory  
  2. public abstract class DAOFactory {  
  3.  
  4.    // List of DAO types supported by the factory  
  5.    public static final int CLOUDSCAPE = 1;  
  6.    public static final int ORACLE = 2;  
  7.    public static final int SYBASE = 3;  
  8.    ...  
  9.  
  10.    // There will be a method for each DAO that can be   
  11.    // created. The concrete factories will have to   
  12.    // implement these methods.  
  13. // 所有實(shí)現(xiàn)該抽象工廠的工廠類中必須有的方法,用這些方法來創(chuàng)建具體的DAO類.  
  14.    public abstract CustomerDAO getCustomerDAO();  
  15.    public abstract AccountDAO getAccountDAO();  
  16.    public abstract OrderDAO getOrderDAO();  
  17.  
  18. //該抽象類的靜態(tài)方法,用他來創(chuàng)建其他具體的DAO工廠類  
  19.    public static DAOFactory getDAOFactory(  
  20.        int whichFactory) {  
  21.     
  22.      switch (whichFactory) {  
  23.        case CLOUDSCAPE:   
  24.            return new CloudscapeDAOFactory();  
  25.        case ORACLE     :   
  26.            return new OracleDAOFactory();        
  27.        case SYBASE     :   
  28.            return new SybaseDAOFactory();  
  29.        ...  
  30.        default            :   
  31.            return null;  
  32.      }  
  33.    }  
  34. }  



2 以下是Cloudscape DAO FACTORY 類的實(shí)現(xiàn),在他里面實(shí)現(xiàn)了該類型數(shù)據(jù)庫的連接,以及實(shí)現(xiàn)了他所繼承的抽象工廠類中所必須實(shí)現(xiàn)的那些方法,在這些方法中創(chuàng)建具體的DAO對(duì)象.

  1. // Cloudscape concrete DAO Factory implementation  
  2. import java.sql.*;  
  3.  
  4. public class CloudscapeDAOFactory extends DAOFactory {  
  5.    public static final String DRIVER=  
  6.      "COM.cloudscape.core.RmiJdbcDriver";  
  7.    public static final String DBURL=  
  8.      "jdbc:cloudscape:rmi://localhost:1099/CoreJ2EEDB";  
  9.  
  10.    // method to create Cloudscape connections  
  11. //建立Cloudscape 連接  
  12.    public static Connection createConnection() {  
  13.      // Use DRIVER and DBURL to create a connection  
  14.      // Recommend connection pool implementation/usage  
  15.    }  
  16. //創(chuàng)建 CustomerDAO 對(duì)象 當(dāng)然返回的是一個(gè)該類實(shí)現(xiàn)的接口,他的好處就是實(shí)現(xiàn)了實(shí)現(xiàn)細(xì)節(jié)的隱蔽.  
  17.    public CustomerDAO getCustomerDAO() {  
  18.      // CloudscapeCustomerDAO implements CustomerDAO  
  19.      return new CloudscapeCustomerDAO();  
  20.    }  
  21. //創(chuàng)建 AccountDAO 對(duì)象 當(dāng)然返回的是一個(gè)該類實(shí)現(xiàn)的接口,他的好處就是實(shí)現(xiàn)了實(shí)現(xiàn)細(xì)節(jié)的隱蔽.  
  22.    public AccountDAO getAccountDAO() {  
  23.      // CloudscapeAccountDAO implements AccountDAO  
  24.      return new CloudscapeAccountDAO();  
  25.    }  
  26. //創(chuàng)建 OrderDAO 對(duì)象 當(dāng)然返回的是一個(gè)該類實(shí)現(xiàn)的接口,他的好處就是實(shí)現(xiàn)了實(shí)現(xiàn)細(xì)節(jié)的隱蔽.  
  27.  
  28.    public OrderDAO getOrderDAO() {  
  29.      // CloudscapeOrderDAO implements OrderDAO  
  30.      return new CloudscapeOrderDAO();  
  31.    }  
  32.    ...  
  33. }  


3 以下代碼就是具體DAO類實(shí)現(xiàn)的接口也就是CloudscapeCustomerDAO()實(shí)現(xiàn)的接口: CustomerDAO .在該接口中定義了所有的業(yè)務(wù)方法.

  1. // Interface that all CustomerDAOs must support  
  2. public interface CustomerDAO {  
  3.    public int insertCustomer(...);  
  4.    public boolean deleteCustomer(...);  
  5.    public Customer findCustomer(...);  
  6.    public boolean updateCustomer(...);  
  7.    public RowSet selectCustomersRS(...);  
  8.    public Collection selectCustomersTO(...);  
  9.    ...  



4 以下CloudscapeCustomerDAO類實(shí)現(xiàn)的具體業(yè)務(wù)細(xì)節(jié)和數(shù)據(jù)操作細(xì)節(jié), 他是要向客戶數(shù)據(jù)端隱蔽的.

  1. import java.sql.*;  
  2. public class CloudscapeCustomerDAO implements   
  3.      CustomerDAO {  
  4.    public CloudscapeCustomerDAO() {  
  5.      // initialization   
  6.    }  
  7.    // The following methods can use  
  8.    // CloudscapeDAOFactory.createConnection()   
  9.    // to get a connection as required  
  10.    public int insertCustomer(...) {  
  11.      // Implement insert customer here.  
  12.      // Return newly created customer number  
  13.      // or a -1 on error  
  14.    }  
  15.    public boolean deleteCustomer(...) {  
  16.      // Implement delete customer here  
  17.      // Return true on success, false on failure  
  18.    }  
  19.    public Customer findCustomer(...) {  
  20.      // Implement find a customer here using supplied  
  21.      // argument values as search criteria  
  22.      // Return a Transfer Object if found,  
  23.      // return null on error or if not found  
  24.    }  
  25.    public boolean updateCustomer(...) {  
  26.      // implement update record here using data  
  27.      // from the customerData Transfer Object  
  28.      // Return true on success, false on failure or  
  29.      // error  
  30.    }  
  31.    public RowSet selectCustomersRS(...) {  
  32.      // implement search customers here using the  
  33.      // supplied criteria.  
  34.      // Return a RowSet.   
  35.    }  
  36.    public Collection selectCustomersTO(...) {  
  37.      // implement search customers here using the  
  38.      // supplied criteria.  
  39.      // Alternatively, implement to return a Collection   
  40.      // of Transfer Objects.  
  41.    }  
  42.    ...  
  43. }  


5 下面的代碼是數(shù)據(jù)客戶端向DAO中傳輸數(shù)據(jù)的, 他其實(shí)就是一個(gè)JAVABEAN;

  1. public class Customer implements java.io.Serializable {  
  2.    // member variables  
  3.    int CustomerNumber;  
  4.    String name;  
  5.    String streetAddress;  
  6.    String city;  
  7.    ...  
  8.  
  9.    // getter and setter methods...  
  10.    ...  
  11. }  



6最后就是客戶數(shù)據(jù)端對(duì)這個(gè)設(shè)計(jì)的應(yīng)用:

  1. ...  
  2. // create the required DAO Factory  
  3. DAOFactory cloudscapeFactory =     
  4.    DAOFactory.getDAOFactory(DAOFactory.DAOCLOUDSCAPE);  
  5. // Create a DAO  
  6. CustomerDAO custDAO =   
  7.    cloudscapeFactory.getCustomerDAO();  
  8. // create a new customer  
  9. int newCustNo = custDAO.insertCustomer(...);  
  10. // Find a customer object. Get the Transfer Object.  
  11. Customer cust = custDAO.findCustomer(...);  
  12. // modify the values in the Transfer Object.  
  13. cust.setAddress(...);  
  14. cust.setEmail(...);  
  15. // update the customer object using the DAO  
  16. custDAO.updateCustomer(cust);  
  17. // delete a customer object  
  18. custDAO.deleteCustomer(...);  
  19. // select all customers in the same city   
  20. Customer criteria=new Customer();  
  21. criteria.setCity("New York");  
  22. Collection customersList =   
  23.    custDAO.selectCustomersTO(criteria);  
  24. // returns customersList - collection of Customer  
  25. // Transfer Objects. iterate through this collection to  
  26. // get values.  



1 創(chuàng)建一個(gè)抽象工廠類,他包含兩個(gè)重要的部分: 第一部分是 一些抽象方法,這些方法是所有實(shí)現(xiàn)該抽象工廠的具體工廠類所必須實(shí)現(xiàn)的. 第二部分 就是一個(gè)靜態(tài)方法,該方法來創(chuàng)建一個(gè)具體類型數(shù)據(jù)源的工廠對(duì)象,比如文中的CloudscapeDAOFactory().

2 然 后,分別創(chuàng)建各個(gè)類型數(shù)據(jù)源的工廠類,(本文以CloudscapeDAOFactory為例).在這個(gè)工廠類中里面也有兩個(gè)重要組成部分: 第一部分就 是實(shí)現(xiàn)在他繼承的那個(gè)抽象工廠類中的左右抽象方法,在該方法中創(chuàng)建具體的DAO對(duì)象(這些對(duì)象的類在第4不具體定義實(shí)現(xiàn)),本文中三個(gè)方法分別創(chuàng)建了3個(gè) 具體的DAO對(duì)象,當(dāng)然為了實(shí)現(xiàn)細(xì)節(jié)的隱蔽,這些方法返回的是這些具體DAO類門實(shí)現(xiàn)的接口(這些接口在第3步實(shí)現(xiàn)).

3 定義具體DAO類的接口,并在接口中定義所有的業(yè)務(wù)方法,和數(shù)據(jù)操作方法.

4 定義具體的DAO類,在這個(gè)類中才是實(shí)際的業(yè)務(wù)方法,和數(shù)據(jù)的操作的實(shí)現(xiàn).

5 定義數(shù)據(jù)傳輸對(duì)象,他是用來在客戶端和DAO之間傳遞數(shù)據(jù)的,他其實(shí)就是一個(gè)JAVABEAN.

6 完成以上5步之后我們就可以在數(shù)據(jù)客戶端使用以上由DAO設(shè)計(jì)模式定義好的各個(gè)類了(見最后一個(gè)代碼例子塊).

以上6步大家在編程的時(shí)需具體體會(huì),一般來說,數(shù)據(jù)庫中的一個(gè)表就可以對(duì)應(yīng)一個(gè)數(shù)據(jù)傳遞類也就是在第4步中定義的那個(gè)類,類中的屬性就是表中的字段,然后加上相應(yīng)的GET,SET 方法. 然后再按模式和以上步驟來定義具體的類.

【編輯推薦】

  1. J2EE常用的設(shè)計(jì)模式
  2. 使用WebSphere構(gòu)建J2EE應(yīng)用程序
  3. J2EE歷史簡(jiǎn)述
  4. Spring的起源和背景 以及你為什么要使用Spring
  5. 使用JBPM工作流引擎測(cè)試的一個(gè)例子 
責(zé)任編輯:book05 來源: 百度博客
相關(guān)推薦

2009-06-11 17:19:47

J2EE設(shè)計(jì)模式Template

2009-06-11 17:23:09

J2EE設(shè)計(jì)模式State模式

2009-06-23 08:06:46

J2EE體系架構(gòu)J2EE模型J2EE設(shè)計(jì)模式

2009-06-11 17:11:07

J2EE設(shè)計(jì)模式工廠模式

2009-06-22 09:34:00

Servlet的生命周

2009-06-23 16:48:26

J2EE常見問題J2EE平臺(tái)

2009-06-19 16:38:45

JDBC簡(jiǎn)介J2EE

2009-06-10 14:10:23

J2EE學(xué)習(xí)J2EE是什么

2009-06-11 17:24:46

J2EE的MVC體系結(jié)J2EE設(shè)計(jì)模式

2009-06-11 17:06:11

J2EE歷史Java EE概述

2009-06-10 13:37:06

J2EE可伸縮性J2EE靈活性J2EE維護(hù)

2009-06-10 13:19:21

J2EE核心APIJ2EE核心組件

2009-02-05 10:54:47

登錄方式J2EEWeb

2009-06-22 17:05:41

Java EEJava企業(yè)應(yīng)用

2009-09-23 17:11:18

數(shù)據(jù)持久層Hibernate

2009-06-18 16:13:14

J2EE開發(fā)

2009-06-22 16:21:02

J2EE線程

2009-06-18 15:54:57

J2EE下使用JNDI

2009-06-23 08:12:48

J2EE調(diào)用存儲(chǔ)過程

2009-06-22 17:34:40

J2EE架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)