java 中的VO,PO,DTO,DO对象

经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析。

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

一、实体类

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

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

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

二、领域模型中的实体类

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

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

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

项目中我们并没有严格遵循这种传递关系,但这种和业务层次的关联对我们理解各实体类的作用是有帮助的。(我们没有接触到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对应于除二者之外需要进行传递的数据。

时间: 2024-08-18 06:45:57

java 中的VO,PO,DTO,DO对象的相关文章

java中的vo 、dto 、dao--转

原文地址:http://yinchunjian.iteye.com/blog/758196 O是跟数据库里表的映射,一个表对应一个VO DAO是用VO来访问真实的表,对数据库的操作都在DAO中完成 BO是业务层,做逻辑处理的 VO , PO , BO , QO, DAO ,POJO, O/R Mapping 是 Object Relational Mapping (对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在 O/R Mapping 的世界里,有两个基本的

理解Java中的VO,PO,BO

VO(Value Object):值对象 PO(Persistent Object):持久对象 两者从结构上来说完全相同,都是拥有一组属性和getter.setter方法组成.但它们的本质和用处却完全不同: VO是在业务层的对象 供业务逻辑使用,VO的属性就是当前业务逻辑需要的数据的名称. PO是数据库里数据的对象表示,它的属性与数据库里字段相对应. BO(Business Object):业务对象 把业务逻辑封装成一个Java对象,这个对象可以包含一个或多个其他的对象,通过调用DAO层的方法对

Java中的基本操作单元 - 类和对象

Java中的基本操作单元 - 类和对象 文本关键字:类.属性.行为.实例化.对象 一.概念浅析 说到类和对象,这都是两个比较抽象的词,如果用在程序中,那就更不知道是什么意思了.其实大家可以先不联系程序,我们在对一大堆东西分类的时候自然是有一个标准的,符合某些特征的分到一类,符合另外一些特征的分到另外一类.在每个类别中,每一样东西都有相同的特征,但是又有所差别,每一样东西就好比一个一个的对象,是一个切切实实的东西,而分类的类别就好似是一个标准或者描述,会更抽象一些. 1. 类的概念 在编程中,我们

java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. if(request instanceof HttpServletRequest){ System.out.println("-------------"); } 原文地址:https://www.cnblogs.com/czlovezmt/p/9728353.html

java中String的特点,字面对象和构造方法的区别

java支持两种常见的方法创建字符串 String s1 = new String("abc"); String s2 = "abc"; 两种方法都有什么区别呢 内存图如下 1,S1首先查看字符串 abc 是否存在字符串常量池中,如果存在则直接指向,不存在,则创建一个 2,S2 查看常量池中 abc 是否存在,结果已经存在了,就直接指向引用了 区别     前者s1 创建了两个对象 堆内存中的new String 和 字符串常量区的 abc     s2只创建了一个

Java中通过Class类获取Class对象的方法详解

方式1:通过Object类的getObject()方法 Person p = new Person(); Class c = p.getClass(); 方式2: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单). Class c2 = Person.class; 方式3: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可) Class c3 = Class.forName("Person

096、Java中String类之手工入对象池操作

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public static void main(String args[]) { // 使用构造方法定义新的内存空间,手工入池 String stra = new String("hello").intern(); String strb = "hello"; // 直接赋值 Sy

java中List对象列表去重或取出以及排序

面试碰到几次list的去重和排序.下面介绍一种做法: 1. list去重 1.1 实体类Student List<Student>容量10k以上,要求去重复.这里Student的重复标准是属性相同,因此需要重写equals和hashcode方法,不知道有几个可以手写出来. student的equals方法: public void equals(Object o){ if(this == o) retun true; if(!(o instanceof Student)) return fal

java中的对象

1. 对象 对象(object):代表现实世界中可以明确标识的一个实体.例如:一个学生.一张桌子等.每个对象都有自己独特的标识.状态和行为. 1) 对象的状态是指那些具有它们当前值的数据域.java使用变量定义数据域. 2) 一个对象的行为是由方法定义的.调用对象的方法就是要对象完成一个动作. 2.使用构造方法构造对象 构造方法是一种特殊的方法,具有以下三个特性: 1) -- 构造方法必须与所在类名字相同. 2) -- 构造方法没有返回值,甚至也没有void. 3) -- 构造方法在创建一个对象