1. 程式人生 > >java中PO、BO、VO、DTO、POJO、DAO是什麼?

java中PO、BO、VO、DTO、POJO、DAO是什麼?

【前面的話】

     在和技術人員的交流中,各種專業術語會出現,每次都是默默的記錄下出現的術語,然後再去網上檢視是什麼意思。最近做專案,需要使用到DTO,然後學習一下吧。

     這篇文章是關於Java DTO的,選擇性閱讀。

【幾個定義】

     分散式系統(distributed system):是建立在網路之上的軟體系統。正是因為軟體的特性,所以分散式系統具有高度的內聚性和透明性。因此,網路和分散式系統之間的區別更多的在於高層軟體(特別是作業系統),而不是硬體。

     分散式軟體系統(Distributed Software Systems)是支援分散式處理的軟體系統,是在由通訊網路互聯的多處理機體系結構上執行任務的系統。它包括分散式作業系統、分散式程式設計語言及其編譯(解釋)系統、分散式檔案系統和分散式資料庫系統等。

     PO:persistant object持久物件,可以看成是與資料庫中的表相對映的java物件。最簡單的PO就是對應資料庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應該不包含任何對資料庫的操作.

     VO:value object值物件。通常用於業務層之間的資料傳遞,和PO一樣也是僅僅包含資料而已。但應是抽象出的業務物件,可以和表對應,也可以不,這根據業務的需要.個人覺得同DTO(資料傳輸物件),在web上傳遞.

     DAO:data access object資料訪問物件,此物件用於訪問資料庫。通常和PO結合使用,DAO中包含了各種資料庫的操作方法。通過它的方法,結合PO對資料庫進行相關的操作.

     BO:business object業務物件,封裝業務邏輯的java物件,通過呼叫DAO方法,結合PO,VO進行業務操作;

     POJO:plain ordinary java object 簡單無規則java物件,我個人覺得它和其他不是一個層面上的東西,VO和PO應該都屬於它.

     Java RMIJava遠端方法呼叫,即Java RMI(Java Remote Method Invocation)是Java程式語言裡,一種用於實現遠端過程呼叫的應用程式程式設計介面。它使客戶機上執行的程式可以呼叫遠端伺服器上的物件。遠端方法呼叫特性使Java程式設計人員能夠在網路環境中分佈操作。RMI全部的宗旨就是儘可能簡化遠端介面物件的使用。

    DTOData transfer object (DTO) is an object that carries data between processes. The motivation for its use has to do with the fact that communication between processes is usually done resorting to remote interfaces (e.g. web services), where each call is an expensive operation.Because the majority of the cost of each call is related to the round-trip time between the client and the server, one way of reducing the number of calls is to use an object (the DTO) that aggregates the data that would have been transferred by the several calls, but that is served by one call only.

    The difference between data transfer objects and business objects or data access objects is that a DTO does not have any behavior except for storage and retrieval of its own data (accessors and mutators). DTOs are simple objects that should not contain any business logic that would require testing

DTO

一、DTO

(一) 客戶端和伺服器端互動情形:

      在分散式系統中,客戶端和伺服器端互動有兩種情形:

      第一個是客戶端從伺服器端讀取資料;

      第二個是客戶端將本身的資料傳遞給伺服器端。

(二) 傳統的方式:

      當有客戶端要向伺服器端傳輸大量資料的時候,可以通過一個包含要傳輸的所有資料的方法呼叫來完成。這在小資料量的時候缺點並不明顯,但是如果要傳遞包含有大量資訊的資料的時候,這將變得難以忍受。

      1. 例子:

1 public void save(String id,String number,String name,int type,int height,int width,BigDecimal weight,BigDecimal price,String description)//我們需要使用這個方法傳遞很多資料,並且如果資料方式變化,這個方法就要發生變化。

      當客戶端要從伺服器端取得大量資料的時候,可以使用多個細粒度的對伺服器端的呼叫來獲取資料。比如:

複製程式碼

1 ISomeInterface intf = RemoteService.getSomeInterface();
2 System.out.println("您要查詢的商品的資料為:");
3 System.out.println("編號:"+intf.getNumber(id));
4 System.out.println("姓名:"+intf.getName(id));
5 System.out.println("型別:"+intf.getType(id));
6 System.out.println("高度:"+intf.getHeight(id));
7 System.out.println("寬度:"+intf.getWidth(id));
8 System.out.println("價格:"+intf.getPrice(id));
9 System.out.println("描述資訊:"+intf.getDescription(id));

複製程式碼

      2. 缺點:

      這種方式中每一個get***方法都是一個對伺服器 的遠端呼叫,都需要對引數和返回值進行序列化和反序列化,而且伺服器進行這些呼叫的時候還需要進行事務、許可權、日誌的處理,這會造成效能的大幅下降。如果沒有使用客戶端事務的話還會導致這些呼叫不在一個事務中從而導致資料錯誤。

(三) DTO方式:

      系統需要一種在客戶端和伺服器端之間高效、安全地進 行資料傳輸的技術。DTO(Data Transfer Object,資料傳送物件)是解決這個問題的比較好的方式。DTO是一個普通的Java類,它封裝了要傳送的批量的資料。當客戶端需要讀取伺服器端的資料的時候,伺服器端將資料封裝在DTO中,這樣客戶端就可以在一個網路呼叫中獲得它需要的所有資料。

      1. 例子:

複製程式碼

 1 ISomeInterface intf = RemoteService.getSomeInterface();
 2 SomeDTOInfo info = intf.getSomeData(id);//我們一次性得到所需要的全部資料,然後在本地去拆分。
 3 System.out.println("您要查詢的商品的資料為:");
 4 System.out.println("編號:"+info.getNumber());
 5 System.out.println("姓名:"+info.getName());
 6 System.out.println("型別:"+info.getType());
 7 System.out.println("高度:"+info.getHeight());
 8 System.out.println("寬度:"+info.getWidth());
 9 System.out.println("價格:"+info.getPrice());
10 System.out.println("描述資訊:"+info.getDescription());

複製程式碼

(四) 使用DTO的好處

  1. 域模型結構可以在一次網路呼叫中複製到客戶端,客戶端可以讀取、更新這個DTO而不需要額外的網路呼叫開銷,而且客戶端還可以通過將更新後的DTO回傳到伺服器端以更新資料
  2. 易於實現快速開發。通過使用域DTO可以直接將域模型在層間傳輸,減少了工作量,可以快速地構建出一個應用。

(五) 缺點:

  1. 將客戶端和伺服器端域物件耦合在一起。如果域模型變了,那麼相應的DTO也會改變,即使對於Hibernate這種PO、DTO一體的系統來說也會同樣導致客戶端的程式碼要重新編譯或者修改。
  2. 不能很好地滿足客戶端的要求。客戶端可能只需要域物件的20個屬性中的一兩個,採用域DTO則會將20個屬性都傳遞到客戶端,浪費了網路資源。
  3. 更新域物件很煩瑣。客戶端對DTO可能做了很多更新或者很深層次的更新,要探查這些更新然後更新域物件是很麻煩的事情。

(六) DTO的例子

      也就是一個javaBean,只是用來封轉資料而已。

複製程式碼

 1 package cn.com.cmbc.ccc.rolemanage.application;
 2 
 3 import java.io.Serializable;
 4 import java.util.HashMap;
 5 
 6 public class UserDTO implements Serializable{
 7     /**
 8      * Property:序列化版本
 9      */
10     private static final long serialVersionUID = 1314L;
11     /**
12      * Property:使用者標識
13      */
14     private String UserId;
15     /**
16      * Property:使用者姓名
17      */
18     private String UserName;
19     /**
20      * Property:使用者性別
21      */
22     private String UserSex;
23     /**
24      * Property:新增額外屬性
25      */
26     private HashMap<String, Object> extProperties;
27     
28     /**
29      * Getter Method
30      * @return 使用者標識
31      */
32     public String getUserId() {
33         return UserId;
34     }
35     /**
36      * Setter Method
37      */
38     public void setUserId(String userId) {
39         UserId = userId;
40     }
41     /**
42      * Getter Method
43      * @return 使用者姓名
44      */
45     public String getUserName() {
46         return UserName;
47     }
48     /**
49      * Setter Method
50      */
51     public void setUserName(String userName) {
52         UserName = userName;
53     }
54     /**
55      * Setter Method
56      */
57     public void setUserSex(String userSex) {
58         UserSex = userSex;
59     }
60     /**
61      * Getter Method
62      * @return 使用者性別
63      */
64     public String getUserSex() {
65         return UserSex;
66     }
67     /**
68      * Setter Method
69      */
70     public void setExtProperties(HashMap<String, Object> extPro){
71         this.extProperties=extPro;
72     }
73     /**
74      * Getter Method
75      * @return 額外的屬性資訊
76      */
77     public HashMap<String, Object> getExtProperties(){
78         return extProperties;
79     }
80 }

複製程式碼

二、POBOVODTOPOJODAO的區別:

(一) PO

       persistant object持久物件

       最形象的理解就是一個PO就是資料庫中的一條記錄。

       好處是可以把一條記錄作為一個物件處理,可以方便的轉為其它物件。

(二) BO

       business object業務物件

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

       比如一個簡歷,有教育經歷、工作經歷、社會 關係等等。

       我們可以把教育經歷對應一個PO,工作經歷對應一個PO,社會 關係對應一個PO。

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

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

(三) VO 

       value object值物件

       ViewObject表現層物件

       主要對應介面顯示的資料物件。對於一個WEB頁面,或者SWT、SWING的一個介面,用一個VO物件對應整個介面的值。

(四) DTO 

       Data Transfer Object資料傳輸物件

       主要用於遠端呼叫等需要大量傳輸物件的地方。

       比如我們一張表有100個欄位,那麼對應的PO就有100個屬性。

       但是我們介面上只要顯示10個欄位,

       客戶端用WEB service來獲取資料,沒有必要把整個PO物件傳遞到客戶端,

       這時我們就可以用只有這10個屬性的DTO來傳遞結果到客戶端,這樣也不會暴露服務端表結構.到達客戶端以後,如果用這個物件來對應介面顯示,那此時它的身份就轉為VO

(五) POJO 

       plain ordinary java object 簡單java物件

       個人感覺POJO是最常見最多變的物件,是一箇中間物件,也是我們最常打交道的物件。

       一個POJO持久化以後就是PO

       直接用它傳遞、傳遞過程中就是DTO

       直接用來對應表示層就是VO

(六) DAO

       data access object資料訪問物件

       這個大家最熟悉,和上面幾個O區別最大,基本沒有互相轉化的可能性和必要。

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