VO,PO區(qū)別
VO克胳,PO 它們的關(guān)系應(yīng)該是相互獨(dú)立的平绩,一個VO可以只是PO的部分,也可以是多個PO構(gòu)成漠另,同樣也可以等同于一個PO(指的是他們的屬性)捏雌。這樣,PO獨(dú)立出來笆搓,數(shù)據(jù)持久層也就獨(dú)立出來了性湿,它不會受到任何業(yè)務(wù)的干涉纬傲,業(yè)務(wù)邏輯層也獨(dú)立開來,它不會受到數(shù)據(jù)持久層的影響肤频,業(yè)務(wù)層關(guān)心的只是業(yè)務(wù)邏輯的處理叹括,不過,如果我們沒有使用數(shù)據(jù)持久層宵荒,或者說沒有使用hibernate汁雷,那么PO和VO也可以是同一個東西,雖然這并不好骇扇。
VO摔竿,值對象(Value Object),PO少孝,持久對象(Persisent Object)继低,它們都是由一組屬性和屬性的get和set方法組成。從結(jié)構(gòu)上看稍走,它們并沒有什么不同的地方袁翁。但從其意義和本質(zhì)上來看是完全不同的:
- VO是用new關(guān)鍵字創(chuàng)建,由GC回收的婿脸。 PO則是向數(shù)據(jù)庫中添加新數(shù)據(jù)時創(chuàng)建粱胜,刪除數(shù)據(jù)庫中數(shù)據(jù)時削除的。且它只能存活在一個數(shù)據(jù)庫連接中狐树,斷開連接即被銷毀焙压。
- VO是值對象,精確點(diǎn)講它是業(yè)務(wù)對象抑钟,是存活在業(yè)務(wù)層的涯曲,是業(yè)務(wù)邏輯使用的,它存活的目的就是為數(shù)據(jù)提供一個生存的地方在塔。PO則是有狀態(tài)的幻件,每個屬性代表其當(dāng)前的狀態(tài)。它是物理數(shù)據(jù)的對象表示蛔溃。使用它绰沥,可以使我們的程序與物理數(shù)據(jù)解耦,并且可以簡化對象數(shù)據(jù)與物理數(shù)據(jù)之間的轉(zhuǎn)換贺待。
- VO的屬性是根據(jù)當(dāng)前業(yè)務(wù)的不同而不同的徽曲,也就是說,它的每一個屬性都一一對應(yīng)當(dāng)前業(yè)務(wù)邏輯所需要的數(shù)據(jù)的名稱麸塞。PO的屬性是跟數(shù)據(jù)庫表的字段一一對應(yīng)的疟位。
PO TO BO POJO DAO DTO
PO(persistant object) 持久對象,通常對應(yīng)數(shù)據(jù)模型(數(shù)據(jù)庫)喘垂,本身還有部分業(yè)務(wù)邏輯的處理甜刻。可以看成是與數(shù)據(jù)庫中的表相映射的java對象正勒。最簡單的PO就是對應(yīng)數(shù)據(jù)庫中某個表中的一條記錄得院,多個記錄可以用PO的集合。PO中應(yīng)該不包含任何對數(shù)據(jù)庫的操作章贞。VO(value object) 值對象祥绞,通常用于業(yè)務(wù)層之間的數(shù)據(jù)傳遞,和PO一樣也是僅僅包含數(shù)據(jù)而已鸭限。但應(yīng)是抽象出的業(yè)務(wù)對象蜕径,可以和表對應(yīng),也可以不败京,這根據(jù)業(yè)務(wù)的需要兜喻。個人覺得同DTO(數(shù)據(jù)傳輸對象),在web上傳遞赡麦。
TO(Transfer Object)朴皆,數(shù)據(jù)傳輸對象,在應(yīng)用程序不同關(guān)系之間傳輸?shù)膶ο蟆?/p>
BO(business object) 業(yè)務(wù)對象泛粹,從業(yè)務(wù)模型的角度看遂铡,見UML元件領(lǐng)域模型中的領(lǐng)域?qū)ο蟆7庋b業(yè)務(wù)邏輯的java對象晶姊,通過調(diào)用DAO方法扒接,結(jié)合PO,VO進(jìn)行業(yè)務(wù)操作们衙。
POJO(plain ordinary java object) 簡單無規(guī)則java對象,純的傳統(tǒng)意義的java對象钾怔。就是說在一些Object/Relation Mapping工具中,能夠做到維護(hù)數(shù)據(jù)庫表記錄的persisent object完全是一個符合Java Bean規(guī)范的純Java對象砍艾,沒有增加別的屬性和方法蒂教。我的理解就是最基本的Java Bean,只有屬性字段及setter和getter方法脆荷。
DAO(data access object) 數(shù)據(jù)訪問對象凝垛,最主要是訪問數(shù)據(jù)類,一個DAO對應(yīng)一個POJO對象蜓谋,是一個sun的一個標(biāo)準(zhǔn)j2ee設(shè)計模式梦皮,這個模式中有個接口就是DAO,它負(fù)持久層的操作桃焕,為業(yè)務(wù)層提供接口剑肯,用于訪問數(shù)據(jù)庫,通常和PO結(jié)合使用观堂,DAO中包含了各種數(shù)據(jù)庫的操作方法让网。通過它的方法呀忧,結(jié)合PO對數(shù)據(jù)庫進(jìn)行相關(guān)的操作。夾在業(yè)務(wù)邏輯與數(shù)據(jù)庫資源中間溃睹。配合VO而账, 提供數(shù)據(jù)庫的CRUD操作。
DTO(Data Transfer Object)數(shù)據(jù)傳輸對象因篇,很少用泞辐,基本放入到DAO中,只是起到過渡的作用竞滓。主要用于遠(yuǎn)程調(diào)用等需要大量傳輸對象的地方咐吼。比如我們一張表有100個字段,那么對應(yīng)的PO就有100個屬性商佑。但是我們界面上只要顯示10個字段锯茄,客戶端用WEB service來獲取數(shù)據(jù),沒有必要把整個PO對象傳遞到客戶端莉御,這時我們就可以用只有這10個屬性的DTO來傳遞結(jié)果到客戶端撇吞,這樣也不會暴露服務(wù)端表結(jié)構(gòu)。到達(dá)客戶端以后礁叔,如果用這個對象來對應(yīng)界面顯示牍颈,那此時它的身份就轉(zhuǎn)為VO