Java學習筆記(十八)——Java DTO


【前面的話】

     在和技術人員的交流中,各種專業術語會出現,每次都是默默的記錄下出現的術語,然后再去網上查看是什么意思。最近做項目,需要使用到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

【參考資料】

     1. PO&VO&DTO

     2. Java DTO

    3. DTO(講的很好)

【后面的話】

    努力學習。

——TT


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM