实体类(VO,DO,DTO)的划分

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

从领域建模中的实体划分、项目中的实际应用情况两个角度,对这几个概念进行简析。

得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除二者之外需要进行传递的数据。

一、实体类

百度百科中对于实体类的定义如下:

实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。

根据以上定义,我们可以了解到,实体类有两方面内容,存储数据和执行数据本身相关的操作。这两方面内容对应到实现上,最简单的实体类是POJO类,含有属性及属性对应的set和get方法,实体类常见的方法还有用于输出自身数据的toString方法。

实体类(VO,DO,DTO)的划分
 

 

二、领域模型中的实体类

领域模型中的实体类分为四种类型:VO、DTO、DO、PO,各种实体类用于不同业务层次间的交互,并会在层次内实现实体类之间的转化。

业务分层为:视图层(VIEW+ACTION),服务层(SERVICE),持久层(DAO)

相应各层间实体的传递如下图:

实体类(VO,DO,DTO)的划分

 

项目中我们并没有严格遵循这种传递关系,但这种和业务层次的关联对我们理解各实体类的作用是有帮助的。(我们没有接触到PO的原因,我理解为ORM对PO进行了封装)

以下是资料的原文,上图是基于此绘制的:

概念:

VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一 一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

模型:

       下面以一个时序图建立简单模型来描述上述对象在三层架构应用中的位置

l        用户发出请求(可能是填写表单),表单的数据在展示层被匹配为VO。

l        展示层把VO转换为服务层对应方法所要求的DTO,传送给服务层。

l        服务层首先根据DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务。

l        服务层把DO转换为持久层对应的PO(可以使用ORM工具,也可以不用),调用持久层的持久化方法,把PO传递给它,完成持久化操作。

l        对于一个逆向操作,如读取数据,也是用类似的方式转换和传递,略。

三、项目中的实体类

项目中常见的实体类有VO,DO和DTO,命名规则也常是以相应字符串结尾,如*VO.Java。但是DTO不总是遵循这个规则,而通常与他的用途有关,如写成*Query.java,表示存储了一个查询条件。项目中实体类出现的业务层次也没有这么严格,例如我们可以在视图层就组装一个DO,也可以将一个VO从持久层传出来,所以与业务分层相关联的划分方法显得有些冗余。从项目代码中抽象出的理解是:VO对应于页面上需要显示的数据,DO对应于数据库中存储的数据,DTO对应于除二者之外需要进行传递的数据。

 

PO(persistant object) 持久对象

 

在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了。通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的 java 对象。最简单的 PO 就是对应数据库中某个表中的一条记录,多个记录可以用 PO 的集合。 PO 中应该不包含任何对数据库的操作。

DO(Domain Object)领域对象

就是从现实世界中抽象出来的有形或无形的业务实体。

TO(Transfer Object) ,数据传输对象

在应用程序不同 tie( 关系 ) 之间传输的对象

DTO(Data Transfer Object)数据传输对象

这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

VO(value object) 值对象

通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已。但应是抽象出的业务对象 , 可以和表对应 , 也可以不 , 这根据业务的需要 。用 new 关键字创建,由 GC 回收的。

BO(business object) 业务对象

从业务模型的角度看 , 见 UML 元件领域模型中的领域对象。封装业务逻辑的 java 对象 , 通过调用 DAO 方法 , 结合 PO,VO 进行业务操作。 business object: 业务对象 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。 比如一个简历,有教育经历、工作经历、社会关系等等。 我们可以把教育经历对应一个 PO ,工作经历对应一个 PO ,社会关系对应一个 PO 。 建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO 。 这样处理业务逻辑时,我们就可以针对 BO 去处理。

POJO(plain ordinary java object) 简单无规则 java 对象

纯的传统意义的 java 对象。就是说在一些 Object/Relation Mapping 工具中,能够做到维护数据库表记录的 persisent object 完全是一个符合 Java Bean 规范的纯 Java 对象,没有增加别的属性和方法。我的理解就是最基本的 Java Bean ,只有属性字段及 setter 和 getter 方法!。

DAO(data access object) 数据访问对象

是一个 sun 的一个标准 j2ee 设计模式, 这个模式中有个接口就是 DAO ,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和 PO 结合使用, DAO 中包含了各种数据库的操作方法。通过它的方法 , 结合 PO 对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合 VO, 提供数据库的 CRUD 操作.

 

转自:https://blog.csdn.net/wangxin1982314/article/details/51954264

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS新建站点服务器,localhost能登录但是IP访问登录不了。

IIS服务器新建站点之后,浏览页面,服务器本地是可以登录,但是localhost换成IP就无法访问。其他站点IP却可以访问。 1.如果浏览直接失败,说明端口号需要更换。 2.如果出现IP不能访问,localhost能访问,需要在高…

eclipse问题_Alt+/不给提示,只补充代码问题的解决方案

今天用eclipse敲代码的时候遇到的问题 我还以为是冲突什么的 还重新装了软件 最后才发现原来是快捷键设置的问题 解决方案: 1:打开菜单window→Preferences,然后在窗口的左侧树选择General->Keys 2:在下图中的5框的地方输入“w…

领域驱动设计:浅析 VO、DTO、DO、PO 概念、区别、用处

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 本篇文章主要讨论一下我们经常会用到的一些对象:VO、DTO、DO和PO。 由于不同的项目和开发人员有不同的命名习惯&#xff0c…

动脑的生活教育

心理学家华生曾经说过:“如果给我一打孩子,我可以把他们变成律师、医师、科学家,或是强盗、土匪。”华生认为,教育孩子就如同马戏团的驯兽师训练野兽一样,是“刺激”与“反应”的联结,不需要任何的“思考”…

前端知识点回顾之重点篇——CORS

CORS(cross origin resource sharing)跨域资源共享 来源:http://www.ruanyifeng.com/blog/2016/04/cors.html 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 简介 CORS需要浏览…

案例:隐秘而低调的内存泄露(OOM)

内存泄露测试的整个过程如下:在手机里启动被测APP并打开DDMS。在DDMS中选中【com.example.android.hcgallery】之后单击按钮【show heap updates】,然后切换到标签页【VM Heap】,再单击按钮【Cause GC】。不断操作APP,并观察Heap。…

员工价值——如何体现自己价值,如何被自己的领导认可

到公司工作快三年了,比我后来的同事陆续得到了升职的机会,我却原地不动,心里颇不是滋味。终于有一天,冒着被解聘的危险,我找到老板理论。 “老板,我有过迟到、早退或乱章违纪的现象吗?”我问。 …

java: PO,VO,TO,BO,DAO,POJO 解释

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑…

[译]JavaScript 究竟是如何工作的?(第一部分)

原文地址:How Does JavaScript Really Work? (Part 1)原文作者:Priyesh Patel如果你是一个 JS 开发者或者是正在学习这门语言的学生,很大概率上你会遇到双字母词"V8"。在这篇文章中,我将会为你简述不同的 JS 引擎并深入…

vue实战(9):总结二

整理前一段所做的工作内容 0.其它 vue实战(1):准备与资料整理vue实战(2):初始化项目、搭建底部导航路由vue实战(3):底部导航显示、搭建各模块静态页面、添加登录页页面与…

一名IT从业者的英语口语能力成长路径

这篇文章是我最近十天口语系列文章的合辑,文章比较长,一万五千余字。但是系统化地归纳了自己十多年的英语尤其是口语方面的学习经历与总结思考。我不是个纯粹的英语专业学生,我甚至不是任何英语相关专业的学生,但是我和英语却有着…

解决:SpringBoot 错误:Caused by: org.yaml.snakeyaml.scanner.ScannerException

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 错误: Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next tokenfound character that cannot s…

好程序员前端分享使用JS开发简单的音乐播放器

好程序员前端分享使用JS开发简单的音乐播放器,最近,我们在教学生使用JavaScript,今天就带大家开发一款简单的音乐播放器。首先,最终效果如图所示:首先,我们来编写html界面index.html,代码如下:&…

学生管理系统stuSystem函数

void stuSystem(){ struct student *head,*stu; int lookup_num; int Delete_num; int Modify_num; char ckeya; int istate0; do { system("cls"); //vc清屏函数&#xff0c;包含在#include<stdlib.h>中 printf(" 欢迎进入学生管理系统&#xff01;\n&q…

OpenCL用于计算机领域的13个经典案例

摘要&#xff1a;当使用加速器和OpenCL时&#xff0c;哪种类型的算法更加快速&#xff1f;来自弗吉尼亚理工大学的Wu Feng教授和他的团队例举了一份算法列表&#xff0c;分享了OpenCL常被用于计算机领域的13个经典案例。 哪种算法可以最好的映射GPU及矢量处理器呢&#xff1f;…

版本控制:集中式(SVN) vs 分布式(GIT)

Linus一直痛恨的CVS及SVN都是集中式的版本控制系统&#xff0c;而Git是分布式版本控制系统&#xff0c;集中式和分布式版本控制系统有什么区别呢&#xff1f; 先说集中式版本控制系统&#xff0c;版本库是集中存放在中央服务器的&#xff0c;而干活的时候&#xff0c;用的都是…

Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件

为什么80%的码农都做不了架构师&#xff1f;>>> 作者| 阿里云智能事业群高级开发工程师 元毅 Knative 主要由 Build、Serving 和 Eventing 三大核心组件构成。Knative 正是依靠这三个核心组件&#xff0c;驱动着 Knative 这艘 Serverless 巨轮前行。下面让我们来分…

树莓派基金会来号召用键盘生物学家研究企鹅

伦敦动物学会&#xff08;Zoological Society of London&#xff09;于2014年&#xff0c;与伍兹霍尔海洋研究所和牛津大学等组织合作监控企鹅的计划Penguin Lifelines有了新进展&#xff0c;伦敦动物学会现与其他动物保护组织合作Penguin Watch项目&#xff0c;邀请民众在网上…

BlockingCollectionT 类实现 列队操作

官方文档 为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能。 通过 BlockingCollection<T> 实现列队调用函数 建立全局变量 BlockingCollection<string> blockingCollection new BlockingCollection<string>(); 建立调用函数…

Git 版本回退

现在&#xff0c;你已经学会了修改文件&#xff0c;然后把修改提交到Git版本库&#xff0c;现在&#xff0c;再练习一次&#xff0c;修改readme.txt文件如下&#xff1a; Git is a distributed version control system. Git is free software distributed under the GPL.然后尝…