• 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

  • 相关阅读:
    并发编程(贰):线程池浅析
    并发编程(壹):创建线程的三种方式及其对比
    Spring Boot使用@Async实现异步调用:自定义线程池
    parallel stream-不能随便使用
    Java 8新特性(四):新的时间和日期API
    Java 8新特性(三):Optional类
    Java 8新特性(二):Stream API
    Java 8新特性(一):Lambda表达式
    ES日期存储
    String,StringBuffer,StringBuillder的底层结构
  • 原文地址:https://www.cnblogs.com/xt0810/p/3654574.html
Copyright © 2020-2023  润新知