DTO笔记

我们为什么需要DTO(数据传输对象)

表现层与应用层之间是通过数据传输对象(DTO)进行交互的,数据传输对象是没有行为的POCO对象,它 的目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不能直接将领域对象用于 数据传递?因为领域对象更注重领域,而DTO更注重数据。不仅如此,由于“富领域模型”的特点,这样 做会直接将领域对象的行为暴露给表现层。

需要了解的是,数据传输对象DTO本身并不是业务对象。数据传输对象是根据UI的需求进行设计的,而不 是根据领域对象进行设计的。比如,Customer领域对象可能会包含一些诸如FirstName, LastName, Email, Address等信息。但如果UI上不打算显示Address的信息,那么CustomerDTO中也无需包含这个 Address的数据

简单来说Model面向业务,我们是通过业务来定义Model的。而DTO是面向界面UI,是通过UI的需求来定义的。通过DTO我们实现了表现层与Model之间的解耦,表现层不引用Model,如果开发过程中我们的模型改变了,而界面没变,我们就只需要改Model而不需要去改表现层中的东西。

DTO就是数据传输对象(Data Transfer Object)的缩写。 DTO模式,是指将数据封装成普通的JavaBeans,在J2EE多个层次之间传输。   DTO类似信使,是同步系统中的Message。  该JavaBeans可以是一个数据模型Model。    

在传统的编程中,我们一般都是前台请求数据,发送到Webservice,然后WebService向数据库发出请求,获取数据,然后一层层返回;模型如下:

QQ截图20140320170753

这种比较原始的请求方式带来的缺点有很多,多次请求耗费一定的网络资源,减慢效率。如果一次性返回整个实体类,还可能造成数据库表结构的泄漏。

采用DTO模型之后,整个流程就不一样了:

QQ截图20140320171127

这样带来的好处有:

1.依据现有的类代码,即可方便的构造出DTO对象,而无需重新进行分析。

2.减少请求次数,大大提高效率。

3.按需组织DTO对象,页面需要的字段我才组织,不需要的我不组织,可以避免传输整个表的字段,一定程度上提高了安全性。

结合个人的开发经验来谈一下用法:

       一般我们使用DTO类来继承entity实体类,在DTO类里放一些业务字段,并提供get、set方法。当我们在业务逻辑层或者交互层用到一些数据库中不存在的字段时,我们就需要在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(讲的很好)

  • 40
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Spring Boot中,DTO(Data Transfer Object)是一种用于数据传输的对象,通常用于在不同层之间传递数据。DTO对象用于封装多个字段或属性,以便将数据从数据库或其他服务层传递到控制器层或前端视图层。 创建DTO对象可以避免直接暴露实体类(Entity)给外部,增加了灵活性和安全性。DTO对象通常只包含需要传输的数据字段,而不包含业务逻辑或复杂的方法。 下面是一个简单的DTO示例: ```java public class UserDTO { private Long id; private String name; private String email; // 其他可能的字段和getter/setter方法 // ... } ``` 在上面的示例中,`UserDTO`是一个简单的DTO类,包含了`id`、`name`和`email`字段。可以根据需要添加其他字段,并提供相应的getter和setter方法。 在实际使用中,可以在服务层或持久层将实体类转换为DTO对象,然后将DTO对象传递给控制器层或前端视图层。这样可以确保数据的安全性和封装性,并且可以根据需要对数据进行转换和处理。 例如,在控制器层处理HTTP请求时,可以接收DTO对象作为方法参数,或者将DTO对象作为方法的返回值,以便进行数据传输。 ```java @RestController @RequestMapping("/api") public class UserController { @Autowired private UserService userService; @PostMapping("/user") public UserDTO createUser(@RequestBody UserDTO userDTO) { // 将用户DTO转换为实体类对象,并调用服务层的方法进行处理 User user = new User(userDTO.getName(), userDTO.getEmail()); User savedUser = userService.createUser(user); // 将保存后的用户实体类对象转换为DTO对象并返回 return new UserDTO(savedUser.getId(), savedUser.getName(), savedUser.getEmail()); } // 其他方法省略... } ``` 在上面的示例中,`createUser()`方法接收一个`UserDTO`对象作为请求体,并将其转换为实体类对象进行处理。然后,将保存后的实体类对象再次转换为DTO对象并返回。 这样,通过使用DTO对象,可以在不同层之间进行数据传输,并进行必要的转换和处理,以实现更好的数据封装和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FREE技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值