DTO笔记

article/2025/9/22 11:39:43

我们为什么需要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(讲的很好)


http://chatgpt.dhexx.cn/article/DyW23aGO.shtml

相关文章

DTO(数据传输对象)模式

0. 写在前面 首先&#xff0c;这是一篇翻译文章&#xff0c;个人建议你可以阅读英文原文Baeldung: The DTO Pattern (Data Transfer Object)&#xff0c;因为个人水平&#xff0c;很多地方翻译的不通顺和晦涩&#xff0c;如果你选择继续往下看&#xff0c;请不要高估了我的英文…

DTO介绍

先看看这张图&#xff0c;dto所处位置&#xff0c;主要是用于业务逻辑层service和表示层servlet之间的数据传输 什么是DTO(Data Transfer Object)数据传输对象&#xff1f; DTO是一个比较特殊的对象&#xff0c;他有两种存在形式&#xff1a; 在后端&#xff0c;他的存在形式…

阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义

常用文件夹分层&#xff1a; pojo vo &#xff08;与前端交互的所有对象&#xff0c;包括接参和返回&#xff09;query &#xff08;查询的筛选条件&#xff0c;前端传参和后端内部传参通用&#xff09;entity &#xff08;数据库表基础对象&#xff09;dto&#xff08;后端内…

R下载与安装详细指南

一、登陆www.r-project.org进入R官网 二、点击左侧CRAN或右侧的download R 三、在China选项&#xff0c;随机点击一个镜像 四、R语言可以在Linux、MAC OS和Windows上运行&#xff0c;根据个人的操作系统选择需要下载的镜像 五、点击下载、运行、选择中文版本 六、安装过程 …

Rstudio下载太慢安装报错???

目录 00引言1、正文1.1踩过的坑1.1.1下载慢1.1.2安装报错 1.2经验方法1.3结果 00引言 因为Rmarkdown的原因&#xff0c;最近开始不想使用原生态的R编译器了。开始升级Rstudio了。但是从下载到安装的坑确实不少。 1、正文 1.1踩过的坑 1.1.1下载慢 这是下载了一晚上的结果&…

R语言下载气象数据

近来气象数据共享网的账户到期&#xff0c;失去日序列数据的下载权限。总结了以下R语言气象数据的下载包。尚未亲自尝试&#xff0c;具体各包的适用情况诸君请自行研究。 package一览 下列所有包的来源均属于 rOpenSci 项目. 1. GSODTools 2. GSOD 3. rnoaa 4. bomrang 5. r…

Linux+conda+R+Rstudio下载安装环境全方面配置

很多小伙伴不习惯在R中用到conda环境&#xff0c;其实这可能是因为你还没有使用到对环境有更高要求的包。 假如我们想安装R包A&#xff0c;它要求的R版本是4.3.0&#xff0c;但是你现在R版本是4.2.0&#xff0c;并且你其他的算法包都是根据4.2.0所创建的&#xff0c;那么就会造…

R语言使用教程(三)——Rstudio添加镜像源(加快包的下载)

文章目录 Windows系统R语言使用教程&#xff08;三&#xff09;——Rstudio添加镜像源(加快包的下载)打开rstudio --> Tools --> Global Options -->Packages --> add -->输入--> Change --> 选择离自己最近的源 --> Apply --> OK参考链接 Windows系…

【数据分析入门】R语言下载与R包新旧设备转移

一、R语言下载 https://cran.rstudio.com/ 二、Rstudio下载 https://www.rstudio.com/products/rstudio/download/#download Rstudio是R语言的集成开发环境 如果R语言是饭&#xff0c;Rstudio就是筷子 不用筷子也行&#xff0c;可以用手&#xff08;直接用R&#xff09; 但是…

R语言批量下载PubMed摘要

1&#xff0c;安装easyPubMed包&#xff1a; install.packages("easyPubMed")2&#xff0c;关键字搜索下载摘要信息 library(easyPubMed) query <- "GATK" #以关键字“GATK”为例 file_name <- "GATK" #保存结果的输出文件的文件名前缀…

R或RStudio下载包时出错解决方案

当我们想要在R&RStudio中下载包时可能会出现如下类似错误 在如下目录中的Rprofile.site文件中对应位置增加一条代码即可&#xff1a; options(download.file.method"libcurl") 修改好后&#xff0c;再次下载即可成功&#xff01;

R语言源代码下载

吐槽&#xff1a;老师说让我去找开源代码&#xff0c;不要用别人做好的软件。 经过调研&#xff0c;有两个可以用的开源软件&#xff0c;一个是bibliometrix&#xff0c;一个是SciMAT。 软件都没用过就算了&#xff0c;学一学就行&#xff0c;可是这些软件只支持英文文献&#…

R3.6.3下载 Rstudio下载及安装,网盘链接永久有效

链接&#xff1a;https://pan.baidu.com/s/1ab1JdmzKDAbDuUv76K3g1Q 提取码&#xff1a;pzkj 永久有效&#xff0c;收藏点赞拿走 记得软件安装路径一定不要有中文、空格&#xff0c;默认安装就没什么问题&#xff0c;其他问题可以联系文末微信号&#xff0c;24小时解答。 参考…

R和Rstudio 下载安装

R下载地址 1.选择自己电脑系统 2.点击base 3.选择合适版本下载 Rstudio下载地址 点击右上角 DOWNLOAD 点击 Free下 DOWNLOAD 选择合适的下载即可 机械安装即可&#xff08;默认安装C盘&#xff0c;可自行更改安装路径&#xff09; 在电脑开始页可看见&#xff0c;如图

R和RStudio下载安装详细步骤

相关文章&#xff1a; r语言基础知识 r语言习题和参考答案 r语言数据分析案例 还有很多相关文章都在我的专栏里面&#xff1a;R语言专栏 本文介绍R和RStudio的下载安装&#xff08;Windows系统&#xff09;&#xff0c;步骤十分详细&#xff08;按照我截图的顺序来即可&#x…

第一课 R语言下载和安装

一、什么是 R 语言 R 编程语言被广泛应用在统计科学和商业领域。在各种编程语言排名中 R 语言的排名 都很靠前。它是一款集成了数据操作、统计&#xff0c;以及可视化功能的优秀开源软件。免费&#xff0c;开源 是 R 重要的特点。 二、什么是 RStudio RStudio 是用亍 R 编…

R语言下载GEOquery包

一开始我用的是R语言常用的下载方式 install.packages(GEOquery) 结果报错了。 然后&#xff0c;我在网上查找资料&#xff0c;看到这个视频 如何在R上下载GEOquery包_哔哩哔哩_bilibili 首先&#xff0c;确认有BiocManager包&#xff0c;没有的话就下载 if(!requireNames…

RStudio 下载R包的几种方法

1. 使用RStudio自带的安装方法&#xff0c;右侧找到Packages&#xff0c;点击Install&#xff0c;然后输入package_name即可 2.使用CRAN&#xff0c;repos后面的镜像地址可以更改&#xff0c;一般使用的是这个清华的镜像。 #一般使用第一行命令进行安装&#xff0c;如果不成功…

R语言——RStudio下载R包时总是下载不成功?解决方案

RStudio下载R包出现Warning in install.packages的情况 原因是&#xff1a;由于RStudio的源是Global&#xff0c;所以在使用install命令去安装包的时候可能会出现数据部分丢失的情况。 解决方法&#xff1a;换源 在工具栏找到Tools->Global Options 在右边的栏目里找到Pack…

Linux简单了解入门学习一

1. 学习Linux之前先认识Unix l Unix是一个强大的多用户、多任务操作系统。 l 于1969年在AT&T的贝尔实验室开发。 l UNIX的商标权由国际开放标准组织(The Open Group)所拥有。 l UNIX操作系统是商业版,需要收费,价格比Microsoft Windows正版要贵一些。 2. Linux l…