1. 程式人生 > 實用技巧 >PO,BO,VO,DTO和POJO的區別

PO,BO,VO,DTO和POJO的區別

PO:persistent object 持久物件

1 .有時也被稱為Data物件,對應資料庫中的entity,可以簡單認為一個PO對應資料庫中的一條記錄。

2 .在hibernate持久化框架中與insert/delet操作密切相關。

3 .PO中不應該包含任何對資料庫的操作。


POJO :plain ordinary java object 無規則簡單java物件

一箇中間物件,可以轉化為PO、DTO、VO。

1 .POJO持久化之後==〉PO

(在執行期,由Hibernate中的cglib動態把POJO轉換為PO,PO相對於POJO會增加一些用來管理資料庫entity狀態的屬性和方法。PO對於programmer來說完全透明,由於是執行期生成PO,所以可以支援增量編譯,增量除錯。)

2 .POJO傳輸過程中==〉DTO

3 .POJO用作表示層==〉VO

PO 和VO都應該屬於它。


BO:business object 業務物件

業務物件主要作用是把業務邏輯封裝為一個物件。這個物件可以包括一個或多個其它的物件。

比如一個簡歷,有教育經歷、工作經歷、社會關係等等。我們可以把教育經歷對應一個PO,工作經歷對應一個PO,社會關係對應一個PO。

建立一個對應簡歷的BO物件處理簡歷,每個BO包含這些PO。

這樣處理業務邏輯時,我們就可以針對BO去處理。

封裝業務邏輯為一個物件(可以包括多個PO,通常需要將BO轉化成PO,才能進行資料的持久化,反之,從DB中得到的PO,需要轉化成BO才能在業務層使用)。

關於BO主要有三種概念

1 、只包含業務物件的屬性;

2 、只包含業務方法;

3 、兩者都包含。

在實際使用中,認為哪一種概念正確並不重要,關鍵是實際應用中適合自己專案的需要。


VO:value object 值物件 / view object 表現層物件

1 .主要對應頁面顯示(web頁面/swt、swing介面)的資料物件。

2 .可以和表對應,也可以不,這根據業務的需要。


DTO(TO):Data Transfer Object 資料傳輸物件

1 .用在需要跨程序或遠端傳輸時,它不應該包含業務邏輯。

2 .比如一張表有100個欄位,那麼對應的PO就有100個屬性(大多數情況下,DTO內的資料來自多個表)。但view層只需顯示10個欄位,沒有必要把整個PO物件傳遞到client,這時我們就可以用只有這10個屬性的DTO來傳輸資料到client,這樣也不會暴露server端表結構。到達客戶端以後,如果用這個物件來對應介面顯示,那此時它的身份就轉為VO。


DAO:data access object資料訪問物件

1 .主要用來封裝對DB的訪問(CRUD操作)。

2 .通過接收Business層的資料,把POJO持久化為PO。

主要用來封裝對資料庫的訪問。通過它可以把POJO持久化為PO,用PO組裝出來VO、DTO


簡易的關係圖:

在這裡插入圖片描述
不同的物件需要用在不同的地方:

VO:值物件、檢視物件
PO:持久物件
QO:查詢物件
DAO:資料訪問物件
DTO:資料傳輸物件
BO:業務邏輯物件

現在傳輸用DTO,條件查詢用BO,查詢物件用POJO接收,顯示物件用VO,程式碼結構更加清晰,也防止了表結構的暴露。