java项目中VO和DTO以及Entity,各自是在啥情况下应用的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java项目中VO和DTO以及Entity,各自是在啥情况下应用的相关的知识,希望对你有一定的参考价值。
就是在项目环境下,这三者的应用场景是什么?最好可以举个例子,方便理解!!
你好,按照标准来说:
1、entity里的每一个字段,与数据库相对应,
2、dto里的每一个字段,是和你前台页面相对应,
3、VO,这是用来转换从entity到dto,或者从dto到entity的中间的东西。
举个例子:
你的html页面上有三个字段,name,pass,age
你的数据库表里,有两个字段,name,pass(注意没有age哦)
而你的dto里,就应该有下面三个(因为对应html页面上三个字段嘛)
private string name;
private string pass;
private string age;
这个时候,你的entity里,就应该有两个(因为对应数据库表中的2个字段嘛)
private string name;
private string pass;
到了这里,好了,业务经理让你做这样一个业务“年龄大于20的才能存入数据库”
这个时候,你就要用到vo了
你要先从页面上拿到dto,然后判断dto中的age是不是大于20,如果大于20,就把dto中的
name和pass拿出来,放到vo中,然后在把vo中的name和pass原封不懂的给entity,然后根据
entity的值,在传入数据库,这就是他们三个的区别
PS,VO和entity里面的字段应该是一样的,vo只是entity到dto,或者dto到entity的中间过程,如果没有这个过程,你仍然可以做到增删改查,这个就根据具体公司来的,纯手打,望采纳
参考技术A通常这三个破东西很迷惑新人,因为我们眨眼一看三个东西竟然一样...好吧,废话少说
按照标准来说:
entity里的每一个字段,与数据库相对应,这是绝大多数公司采用的叫法
dto里的每一个字段,是和你前台页面相对应,主要表示前端->后端,其中t表示transport,是传输的意思,dto就是传输对象,它可以用来表示前端传递给后端的对象,也可以表示服务与服务(后台与后台)之间的对象,有些公司把dto也叫做form,也有叫pojo,还有叫po的,
vo里的每个字段,也是和你前台页面相对应的,主要表示后端->前端(注意与DTO区别),其中vo中的v表示view,视图的意思,如果你了解spring mvc的ModelAndView,那么vo层应该很好理解
接下来我举一个例子
-------------------------下面你读懂了,就一下明白了-------------------
你的html页面上有三个字段,name,pass,age
你的数据库表里,有两个字段,name,pass(注意没有age)
而你的dto里,就应该有下面三个(因为对应html页面上三个字段)
private string name;
private string pass;
private string age;
这个时候,你的entity里,就应该有两个(因为对应数据库表中的2个字段)
private string name;
private string pass;
到了这里,好了,业务经理让你做这样一个业务“年龄大于20的用户才能存入数据库,否则不让,入库成功之后,需要跳转到用户列表页面(比方说是个分页查询页面),用户分页列表页面只显示name”
这个时候,你就要用到vo了,vo只有一个字段,所以你会返回一个List的列表,List里装的VO
private string name;
VO,DTO,ENTITY只是为了软件分层,如果你不分层,也完全可以做到程序完美运行,甚至可以抬杠的说,内存开销反而更小,但是分层是有巨大好处的,尤其是在架构上,比方说
可以对所有的DTO进行一个拦截,然后进行同意的数据校验,而不用在每个接口(比方说Spring MVC的controller)中判断
可以对所有返回值进行封装,比方说如果返回值是vo结尾的类名,或者在你们公司xxx.vo包下,那么就可以对这个返回值都包装一层,多出code,status等字段,方便前端接受请求
具体这些东西叫vo,还是vvvvoooo,完全取决于你们公司,主要是理解分层这个概念就好了
追问多表查询出来的数据,是用DTO保存吧。
我理解的是:entity跟数据库表字段一一对应;VO里可以放entity也可以放list包括List、list还有其他dto; DTO里可以放其他的dto,同样也可以放entity和list/list。当然VO和DTO都可以放字段属性。
Data Transfer Object数据传输对象
应用场景:
主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO
Entity 实体
实体bean ,一般是用于ORM 对象关系映射 ,一个实体映射成一张表,一般无业务逻辑代码。
如果是简单的java对象就是pojo,如果进行了持久化有了orm映射以后就是po。
po的作用简单的说就是将数据库中的表映射成java对象,就是属性对应数据库字段。
VO
主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。
比如在某页面上需要显示很多数据,但是一个po搞不定,这是你就可以自己定义Vo去处理了。 参考技术C 你抄别人的?是说那个被采纳的回答……
POJO,JAVABEAN,Entity,domain,DTO,ejb区别
在网上搜索过所有名词的定义后,我总结了下面这张表
应该把java中一些对象缩写都说明白了
2018.04.21
类型 | 定义 | 作用 | 其他 |
pojo | (Plain Ordinary Java Object)简单的Java对象 | 普通JavaBeans,有时可以作为VO(value-object)或DTO(Data Transfer Object)来使用 | |
javabean | 为写成JavaBean,类必须是具体和公共的,并且具有无参数的构造器。 | 简单的就是pojo,复杂的就是ejb | |
ejb | EJB(Enterprise JavaBean),定义用于开发基于组件的企业多重应用程序标准 | java的核心代码,分别是回话Bean(Session Bean)、实体Bean(Entity Bean)、和消息驱动Bean(MessageDriven Bean) | |
domain | domain是范围,界线,也被用来批一个变量的有效作用域 | 也常用这个词做一个包,然后在里面放些DAO类文件. net.baidu.domain.AddUserDao | |
dto | 数据传输对象(Data Transfer Object),是一种设计模式之间传输数据的对象 | 数据传输目标往往是数据访问对象从数据库中检索数据,从PO中取值进行传输 | |
entity | 实体bean,一般是用于ORM对象关系映射 | 一个实体映射成一张表,一般无业务逻辑代码。 | |
po | persistant object持久对象 | 最形象的理解就是一个PO就是数据库中的一条记录,如hibernate中的一个持久化对象 | |
vo | ViewObject表现层对象 | 主要对应界面显示的数据对象。对于一个WEB页面,用一个VO对象对应整个界面的值。 | |
dao | data access object数据访问对象 | 主要用来封装对数据库的访问,包含了各种数据库的操作方法。通过它可以把POJO持久化为PO,用PO组装出来VO、DTO | |
bo | business object业务对象 | 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。 |
BO:business object业务对象
主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、 关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO, 关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对BO去处理。
DTO :Data Transfer Object数据传输对象,主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO
VO、PO、FormBean之间的区别:
VO是独立的Java Object;而PO是Hibernate纳入其实体容器(Entity Map)的对象。
PO代表了与数据库中某条记录相对应的Hibernata实体,PO的变化在事务提交时将反映到实际的数据库中。
FormBean只是HTML中表单的封装,是为了弱化request中存储数据的作用,将request对象的get()方法转化为对象的存取值。
VO和PO在结构上看,没什么区别。但从本质上看是完全不同的。
VO由new关键字创建,由GC回收。PO则是向数据库中添加新数据时创建,删除数据库中数据时删除,并且它只能存活在一个数据库连接中,断开连接即被销毁。
VO是业务对象,由业务逻辑使用,它存活的目的就是为数据提供一个生存的地方。PO则是数据对象的表现,它可以简化对象数据与物理数据的转换。
VO的属性根据当前的业务不同而不同。PO的属性则是跟数据库表的字段一一对应。PO对象需要实现序列化接口。
在Hibernate中,最核心的概念就是对PO的状态管理。一个PO有三种状态:
1.未被持久化的VO,此时就是一个内存对象VO,由JVM管理生命周期。
2.已被持久化的PO,并且在Session生命周期内,此时映射数据库连接,由数据库管理生命周期。
3.曾被持久化过,但现在和Session已经托管(detached)了,以VO的身份在运行。它还可以进入另一个Session,继续PO状态管理。
需要注意的是, PO最好只在持久层使用,如果脱离持久层到处使用,会给Hibernate带来不小的PO对象维护开销。
以上是关于java项目中VO和DTO以及Entity,各自是在啥情况下应用的的主要内容,如果未能解决你的问题,请参考以下文章
Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
Java中几种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)