日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
J2EE之DAO設(shè)計(jì)模式簡介與實(shí)例

在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ù)庫,簡單文件儲(chǔ)存,其他方式)和提供商自定義數(shù)據(jù)類型的不同而有很大的區(qū)別。

出現(xiàn)的問題:
許 多投入使用的,J2EE WEB 應(yīng)用程序在一些時(shí)候需要進(jìn)行數(shù)據(jù)的持久化. 對于很多的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ù)庫這樣的持久化載體中,對數(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在使用上,語法和格式也各不相同.

對 于不同類型的數(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ù)源對 應(yīng)用程序的編寫提出了很大的挑戰(zhàn),而且很有可能在編寫的過程中造成程序代碼和數(shù)據(jù)訪問代碼間產(chǎn)生相互依賴性.當(dāng)商業(yè)組件諸如:實(shí)體BEAN,會(huì)話 BEAN,以及servlets和JSP幫助對象這樣的表示組件需要訪問數(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幫手對象這樣的組件,通常需要從持久化的數(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文檔,簡單文件等等,使得API各不相同和性能各異。我們?nèi)狈σ环N統(tǒng)一的API來對以 上的不同的系統(tǒng)或者文件載體進(jìn)行操作。

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

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

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

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

數(shù) 據(jù)訪問對象實(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è)組件只對他的客戶端暴露一些非常簡單的DAO外部接 口. DAO將數(shù)據(jù)源的實(shí)現(xiàn)細(xì)節(jié)對客戶端完全的隱藏了起來. 因?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對象.

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文檔,也可以是簡單文件 等等. 當(dāng)然他也可以是其他的系統(tǒng),(遺留系統(tǒng),大型主機(jī)),可以是服務(wù)(B2B服務(wù),信用卡局服務(wù))或者是像LDAP這樣的數(shù)據(jù)庫等.

4 TransferObject他代表的是傳遞對象,一般用于數(shù)據(jù)的載體. DataAccessObject使用傳遞對象來將數(shù)據(jù)返回給客戶端. DataAccessObject也可以使用傳遞對象來從客戶端接受數(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)的對數(shù)據(jù)庫進(jìn)行檢查,然后按照實(shí)際情況來提供一些必要的DAO來訪問數(shù)據(jù) 庫. 如果對于DAO的要求過于復(fù)雜,則考慮使用第三方工具來為關(guān)系型數(shù)據(jù)庫提供對象到關(guān)系的映射.這些工具一般都包含圖形化的用戶界面可以方便的將商業(yè) 對象影射到持久化對象上,于是就可以定義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工廠對象(抽象工廠),用他來創(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對象.

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

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

2 遷移簡單化:
DAO 層的出現(xiàn),使得應(yīng)用程序向不同的數(shù)據(jù)庫實(shí)現(xiàn)進(jìn)行遷移變的容易.商業(yè)對象可以對底層數(shù)據(jù)實(shí)現(xiàn)一無所知.這樣,遷移只涉及到了對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è)對象中的編程難度.
由于DAO管理著所有的數(shù)據(jù)訪問細(xì)節(jié),因而大大簡化了在商業(yè)對象和其他使用DAO的數(shù)據(jù)客戶端里的代碼.所有的實(shí)現(xiàn)細(xì)節(jié)相關(guān)的代碼比如(SQL 語句)都包含在DAO而不在商業(yè)對象中. 這樣使得代碼變的更加健壯而且大大提高了開發(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 對容器管理持久化無用
由 于EJB容器使用CMP(容器管理持久化)來管理實(shí)體BEAN. 容器會(huì)自動(dòng)的為持久化儲(chǔ)存訪問提供服務(wù).應(yīng)用程序使用容器管理的實(shí)體BEAN則不需要 DAO層的參與.因?yàn)閼?yīng)用程序服務(wù)器本身就可以透明的提供這些功能.然而,DAO在組合式CMP和BMP需要的場合下還是有用的.

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

7 需要對類的相互繼承關(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 等一些對象。

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

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

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

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.    ...
  10. }

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.    // getter and setter methods...
  9.    ...
  10. }

6最后就是客戶數(shù)據(jù)端對這個(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ù)源的工廠對象,比如文中的CloudscapeDAOFactory().

2 然 后,分別創(chuàng)建各個(gè)類型數(shù)據(jù)源的工廠類,(本文以CloudscapeDAOFactory為例).在這個(gè)工廠類中里面也有兩個(gè)重要組成部分: 第一部分就 是實(shí)現(xiàn)在他繼承的那個(gè)抽象工廠類中的左右抽象方法,在該方法中創(chuàng)建具體的DAO對象(這些對象的類在第4不具體定義實(shí)現(xiàn)),本文中三個(gè)方法分別創(chuàng)建了3個(gè) 具體的DAO對象,當(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ù)傳輸對象,他是用來在客戶端和DAO之間傳遞數(shù)據(jù)的,他其實(shí)就是一個(gè)JAVABEAN.

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

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


文章標(biāo)題:J2EE之DAO設(shè)計(jì)模式簡介與實(shí)例
URL鏈接:http://m.5511xx.com/article/ccogsdi.html