- 浏览: 310204 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
fanlei77:
很有用,谢谢
git branch -
han1051:
123123
Spring框架下PropertyPlaceholderConfigurer类 -
wangbing9577:
言简意赅。
代理模式 适配器模式 与 外观模式 区别 比较 特点 -
azheng270:
用户和权限为什么会有直接连线
通用权限管理系统设计篇(一) -
cectsky:
nice,i know ,thank you ~
Spring框架下PropertyPlaceholderConfigurer类
概念:
VO
(
View Object
):
视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO
(
Data Transfer Object
):
数据传输对象,这个概念来源于
J2EE
的设计模式,原来的目的是为了
EJB
的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO
(
Domain Object
):
领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
PO
(
Persistent Object
):
持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应
PO
的一个(或若干个)属性。
VO
与
DTO
的区别
大家可能会有个疑问(在笔者参与的项目中,很多程序员也有相同的疑惑):既然
DTO
是展示层与服务层之间传递数据的对象,为什么还需要一个
VO
呢?对!对于绝大部分的应用场景来说,
DTO
和
VO
的属性值基本是一致的,而且他们通常都是
POJO
,因此没必要多此一举,但不要忘记这是实现层面的思维,对于设计层面来说,概念上还是应该存在
VO
和
DTO
,因为两者有着本质的区别,
DTO
代表服务层需要接收的数据和返回的数据,而
VO
代表展示层需要显示的数据。
用一个例子来说明可能会比较容易理解:例如服务层有一个
getUser
的方法返回一个系统用户,其中有一个属性是
gender(
性别
)
,对于服务层来说,它只从语义上定义:
1-
男性,
2-
女性,
0-
未
指定,而对于展示层来说,它可能需要用“帅哥”代表男性,用“美女”代表女性,用“秘密”代表未指定。说到这里,可能你还会反驳,在服务层直接就返回“帅
哥美女”不就行了吗?对于大部分应用来说,这不是问题,但设想一下,如果需求允许客户可以定制风格,而不同风格对于“性别”的表现方式不一样,又或者这个
服务同时供多个客户端使用(不同门户),而不同的客户端对于表现层的要求有所不同,那么,问题就来了。再者,回到设计层面上分析,从职责单一原则来看,服
务层只负责业务,与具体的表现形式无关,因此,它返回的
DTO
,不应该出现与表现形式的耦合。
理论归理论,这到底还是分析设计层面的思维,是否在实现层面必须这样做呢?一刀切的做法往往会得不偿失,下面我马上会分析应用中如何做出正确的选择。
VO
与
DTO
的应用
上面只是用了一个简单的例子来说明
VO
与
DTO
在概念上的区别,本节将会告诉你如何在应用中做出正确的选择。
在以下才场景中,我们可以考虑把
VO
与
DTO
二合为一(注意:是实现层面):
以下场景需要优先考虑
VO
、
DTO
并存:
DTO
与
DO
的区别
首先是概念上的区别,
DTO
是展示层和服务层之间的数据传输对象(可以认为是两者之间的协议),而
DO
是对现实世界各种业务角色的抽象,这就引出了两者在数据上的区别,例如
UserInfo
和
User
(对于
DTO
和
DO
的命名规则,请参见笔者前面的一篇博文),对于一个
getUser
方法来说,本质上它永远不应该返回用户的密码,因此
UserInfo
至少比
User
少一个
password
的数据。而在领域驱动设计中,正如第一篇系列文章所说,
DO
不是简单的
POJO
,它具有领域业务逻辑。
DTO
与
DO
的应用
从上一节的例子中,细心的读者可能会发现问题:既然
getUser
方法返回的
UserInfo
不应该包含
password
,那么就不应该存在
password
这个属性定义,但如果同时有一个
createUser
的方法,传入的
UserInfo
需要包含用户的
password
,怎么办?在设计层面,展示层向服务层传递的
DTO
与服务层返回给展示层的
DTO
在概念上是不同的,但在实现层面,我们通常很少会这样做(定义两个
UserInfo
,甚至更多),因为这样做并不见得很明智,我们完全可以设计一个完全兼容的
DTO
,在服务层接收数据的时候,不该由展示层设置的属性(如订单的总价应该由其单价、数量、折扣等决定),无论展示层是否设置,服务层都一概忽略,而在服务层返回数据时,不该返回的数据(如用户密码),就不设置对应的属性。
对于
DO
来说,还有一点需要说明:为什么不在服务层中直接返回
DO
呢?这样可以省去
DTO
的编码和转换工作,原因如下:
对于
DTO
来说,也有一点必须进行说明,就是
DTO
应该是一个“扁平的二维对象”,举个例子来说明:如果
User
会关联若干个其他实体(例如
Address
、
Account
、
Region
等),那么
getUser()
返回的
UserInfo
,是否就需要把其关联的对象的
DTO
都一并返回呢?如果这样的话,必然导致数据传输量的大增,对于分布式应用来说,由于涉及数据在网络上的传输、序列化和反序列化,这种设计更不可接受。如果
getUser
除了要返回
User
的基本信息外,还需要返回一个
AccountId
、
AccountName
、
RegionId
、
RegionName
,那么,请把这些属性定义到
UserInfo
中,把一个“立体”的对象树“压扁”成一个“扁平的二维对象”,笔者目前参与的项目是一个分布式系统,该系统不管三七二十一,把一个对象的所有关联对象都转换为相同结构的
DTO
对象树并返回,导致性能非常的慢。
DO
与
PO
的区别
DO
和
PO
在绝大部分情况下是一一对应的,
PO
是只含有
get/set
方法的
POJO
,但某些场景还是能反映出两者在概念上存在本质的区别:
DO
与
PO
的应用
由于
ORM
框架的功能非常强大而大行其道,而且
JavaEE
也推出了
JPA
规范,现在的业务应用开发,基本上不需要区分
DO
与
PO
,
PO
完全可以通过
JPA
,
Hibernate Annotations/hbm
隐藏在
DO
之中。虽然如此,但有些问题我们还必须注意:
发表评论
-
性能监控与性能问题定位之:Java篇
2012-04-09 15:50 1115http://hi.baidu.com/higkoo/ ... -
BeanUtils.copyProperties 日期转字符 日期转Long
2012-03-15 11:05 2432建立自己的日期转换类 import org.apache.c ... -
java 正则
2011-11-18 13:27 796http://edu.yesky.com/edupxpt/18 ... -
apache common 工具
2011-11-03 16:24 1280common-lang (2.1) ... -
git branch
2011-10-26 16:04 1176http://f2e.us/wiki/git-branch ... -
TortoiseSVN svn:external 设置外部svn目录的属性
2011-02-17 14:57 6043项目开发时,各个人员之间都会使用公共项目中的文件。可 ... -
synergy quicksynergy 共享ubuntu 和 windows 7
2011-01-21 19:27 26701. 在windows 7 下 安装 synergy 2. ... -
详细解析Java中抽象类和接口的区别
2010-10-12 15:25 940抽象类和接口 抽象类仅提供一个类的部分实现 ... -
文件操作
2010-09-25 20:56 997File File 类 只操作文件,不对文件中的内容进行操作 ... -
中文乱码问题解决,过滤器配置,get post提交乱码,filter,struts乱码,jsp乱码
2010-09-14 15:19 1220Xml代码 <filter> ... -
PO/VO/DAO/BO/POJO是什么(JAVA几种对象的解释)
2010-08-31 00:17 1452java的几种对象(PO,VO,DAO,B ... -
svn 中tag branch trunk 的用法
2010-05-19 15:54 2050在SVN中Branch/tag在一个功能选项中,在使用中也往往 ... -
interview
2010-05-04 09:44 0以下题有些经过测试,修改之后,大多能运行。 1.现在输入 ... -
Sting字符串交集并集差集
2010-04-29 13:31 0package com.thomas.test; imp ... -
jsp的url中文参数解决办法
2009-06-23 18:38 10321.页面头部添加 <%@ page contentTy ... -
getAttribute和getParameter的区别
2008-07-18 10:00 1187getAttribute和getParameter的区别 JS ... -
JSP编程进度条设计
2008-07-14 10:42 1042许多Web应用、企业应用涉及到长时间的操作,例如复杂的数据库 ... -
[zt]JDBC DAO设计
2008-07-08 13:48 1390Connection的含义 Connection表示了一 ... -
Linux下内存释放问题相关知识
2008-07-03 15:20 1387细心的朋友会注意到,当 ... -
hashtable和hashmap的区别
2008-06-12 10:48 943HashTable的应用非常广泛,HashMap是新框架中用来 ...
相关推荐
以下是关于POJO、VO、PO、DO、DTO的详细解释及其区别。 1. POJO(Plain Old Java Object):POJO是一个通用术语,指没有特定框架限制的简单Java对象。它通常包含了业务逻辑和数据属性,不包含任何特定框架的注解或...
### Java中的PO、VO、TO、BO、DAO与POJO详解 #### 一、概述 在Java企业级应用开发中,经常会遇到各种类型的对象,如PO、VO、TO、BO、DAO以及POJO等。这些对象各有侧重,在系统架构的不同层次扮演着不同的角色。...
在Java开发中,我们经常会遇到各种各样...例如,PO和DAO一起用于数据持久化,BO处理业务逻辑,而VO和DTO则专注于数据的传输和展示。了解这些术语,对于提升代码质量、提高团队沟通效率以及优化系统设计都具有重要意义。
java简单基础 需要的了解一下 我们大家还是有必要去区分的
通过对VO、DTO、BO、ORM、DAO、Entity、DO、PO 和 POJO 的深入分析,我们可以看出这些概念在不同的层次和场景下发挥着各自的作用。正确地使用这些模型能够帮助开发者更好地组织代码,提高系统的可维护性和扩展性。在...
J2EE基础知识之DTO,VO,PO,DO等定义J2EE基础知识之DTO,VO,PO,DO等定义J2EE基础知识之DTO,VO,PO,DO等定义
Java中 PO VO BO DTO DAO 和 POJO 关系图
然而,对于VO对象、DTO对象以及前端Vue页面等非预置的代码生成需求,就需要我们对默认的代码生成器进行扩展和定制。 在MyBatisPlus 3.5.3版本中,代码生成器主要有两种类:`AutoGenerator`和`FastAutoGenerator`。`...
本人以前搞不懂这些o的区别,特意查找资料总结了一下,希望也可以帮到其他人
在实际开发中,我们可以通过一些自动化工具,如Dozer、MapStruct等,来简化VO和DTO之间的数据映射过程,减少手动编写转换代码的工作量。同时,为了提高效率和减少内存占用,还可以考虑使用流式API处理大数据量的DTO...
J2EE开发人员必须知道 Java Web开发中VO、PO、DTO、POJO代表含义。
在 Java 中,PO、VO、BO、POJO、DAO、DTO、TO、QO 等概念都是 O/R Mapping 中的重要概念。它们之间的关系是:BO 封装业务逻辑,调用 DAO 方法,结合 PO 和 VO 进行业务操作。DAO 中包含了各种数据库的操作方法,通过...
VO和PO相似,但VO更像是抽象出的业务对象。VO在Web上传递中也可以和DTO(数据传输对象)混淆,但它们之间有一些细微的区别。 TO(Transfer Object)数据传输对象 TO是Java中的数据传输对象,在应用程序不同关系之间...
Java 实现相同属性名称及相似类型的 POJO、DTO、VO 等互转操作 Java 实现相同属性名称及相似类型的 POJO、DTO、VO 等互转操作是 Java 编程中一个常见的问题。POJO、DTO、VO 等都是 Java 中常用的类别,但是它们之间...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
在O/R Mapping的上下文中,VO和PO具有以下特点: 1. **VO vs PO**: - **VO**(值对象):通常用new关键字创建,并由垃圾回收器(GC)回收。它是业务逻辑使用的对象,主要目的是为数据提供存储位置。 - **PO**...
在Java开发中,数据传输对象(DTO)和持久化对象(POJO)是常见的概念,它们用于在不同层之间传递数据。手动创建这些类可能会耗费大量时间,特别是在处理大量数据库表时。因此,"eclipse插件,根据数据库表自动生成...
这个工具类“JsonUtil”是为了帮助开发者快速将Android中的实体类对象(Entity、VO、DTO、Model)转化为JSON字符串,方便进行网络请求或存储数据。 一、JsonUtil类的设计与实现 JsonUtil通常是一个静态类,包含一...
FreeMarker通用模板。... 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据