PO/BO/VO/DTO/POJO/DAO/DO

DO(Domain Object)

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

比如一个商城的项目,商城主要的模块就是用户、订单,商品三大模块,那么这三块数据就可以叫作三个域;再比如一个招聘网站的项目,用户、简历、岗位三大模块,这三块数据就可以叫作三个域。

那么招聘网站的简历是怎么存到数据库的呢,不可能用一张表就能存的,因为简历包含基本信息和工作经验,项目经验,学习经验等。基本信息可以存在简历表,但是涉及到多条的就不行,因为没人知道有多少条工作经验,项目经验,所以必须要单独建工作经验表和项目经验表关联到简历基本信息表。但是前端页面是不关心这些的,前端需要的数据就是一个简历所有的信息,这时就可以用 DO 来处理,DO 对象就是一个简历对象,包含了简历基本信息以及工作经验,项目经验等。这样前端只需要获取一个对象就行了,不需要获取基本信息的同时,还要从基本信息里面获取简历编号,再拿着简历编号去获取相关的工作经验、项目经验等信息。

DO 其实是 VO 的一种,是一种更为复杂的 VO。
DO 和 BO 在作用上相同。

DO(Data Object)

DO( Data Object):与数据库表结构一一对应。

这个 DO 和 PO 作用相同。

PO

Persistent Object,持久对象。POJO 在持久层的体现,对 POJO 持久化后就成了 PO。PO 其实就是 Object Relation Mapping 框架中的实体类(Entity),PO 每个属性基本上都对应数据表里面的某个字段。

一般 PO 类与数据表对应,一个 PO 对象对应数据表的一条记录。

PO 通常是指 Entity Bean 对象。

VO

Value Object/View Object,值对象/视图对象。VO 和 PO 一样也是仅仅包含数据而已。通常是抽象出的业务对象,可以和数据库表对应,也可以不对应,这根据业务的需要。

VO 一般对应于页面上需要显示的数据(表单)。用于界面显示的数据对象,一个 VO 对象封装整个界面展示所需要的数据。

DO 其实是 VO 的一种。

POJO 在表现层的体现。 当我们处理完数据时,需要展现时,这时传递到表现层的POJO就成了VO。它就是为了展现数据时用的。

BO

Business Object,业务对象。BO 是 POJO 在业务层的体现,对于业务操作来说,更多的是从业务上来包装对象,通过调用 DAO 方法,结合 PO 进行业务操作

BO 和 Domain Object 的作用类似。

如一个 User 的 BO,可能包括name, age, sex, privilege, group等,这些属性在数据库中可能会在多张表中,因为每一张表对应一个PO,而我们的BO需要这些PO组合起来(或说重新拼装)才能成为业务上的一个完整对象。

举例说明:
比如一份简历,有教育经历、工作经历、社会关系等。
我们可以创建一个对应教育经历的 PO 对象,创建一个对应工作经历的 PO 对象,创建一个对应工作经历的 PO 对象,再创建一个对应整份简历的 BO 对象,再将上述的 PO 对象全部封装到 BO 对象中。

业务对象。 由Service层输出的封装业务逻辑的对象。

谁将多个 PO 封装成 一个 BO 对象?
BO 对象只能用于装载数据,不具有业务逻辑处理的能力?

DTO

Data Transfer Object,数据传输对象。是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。

数据传输对象,Service或Manager向外传输的对象。

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

简单来说,当我们需要一个 PO 对象中的 10 个字段的数据,但这个对象总共有 20 个字段,我们不需要把整个 PO 对象全部字段传输到客户端,就可以用 DTO 重新封装,传递到客户端。如果这个 DTO 对象对应于某个界面的展现数据,就叫 VO。

当我们需要在两个系统间传递数据时,一种方式就是将 POJO 序列化后传递,这个传递状态的 POJO 就是DTO。

POJO

Plain Ordinary Java Object,简单的 Java 对象,实际就是普通 JavaBeans,是为了避免和 EJB 混淆所创造的简称。

POJO 类含有属性及属性对应 getter、setter 方法,没有业务逻辑,有时可以作为 VO(Value Object)或DTO(Data Transfer Object)来使用。不允许有业务方法,也不能携带 Connection 之类的方法。

一个 POJO 持久化以后就是 PO;用它传递数据就是 DTO;直接用来对应显示层的数据就是 VO。

BO、VO、DTO、DO、PO 统称为 POJO,都是简单的 JavaBean。

DAO

Data Access Object,数据访问对象。DAO 是一个数据访问接口。它可以把 POJO 持久化为 PO,使用 PO 组装成 VO、DTO。

一个典型的 DAO 实现有下列几个组件:
1.一个DAO工厂类;
2.一个DAO接口;
3.一个实现 DAO 接口的具体类;
4.数据传递对象(有些时候叫做值对象)。

具体的 DAO 类包含了从特定的数据源访问数据的逻辑,一般一个 DAO 类对应一张数据表,每个操作要和事务关联。

JavaBean

JavaBean 是一种 Java 语言写成的可重用组件。对 JavaBean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean。但通常情况下,由于 JavaBean 是被容器创建的,类必须是具体和公共的,并且具有无参数的构造器。

JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成属性。JavaBean 主要指的是一种规范,即包含一组 set 和 get 方法的类。

和 Entity Bean 的区别是,JavaBean 可以包含业务逻辑代码,并且不一定与数据表对应。

另外,通常 JavaBean 还要实现 Serializable 接口用于实现 Bean 的持久性。

EJB

Enterprise JavaBean(EJB)。EJB 是 JavaEE 的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。是 Java 的核心代码,分别是回话 Bean(Session Bean)、实体 Bean(Entity Bean)、和消息驱动Bean(MessageDriven Bean)

EJB 我认为它是一组“功能” JavaBean 的集合。上面说了JavaBean 是实现了一种规范的 Java 对象。这里说EJB 是一组 JavaBean,意思是这一组 JavaBean 组合起来实现了某个组件的业务逻辑。这里的一组 JavaBean不是乱组合的,它们要满足能实现某项业务功能的搭配。打个比方,对于一身穿着来说,包括一顶帽子,一件衣服,一条裤子,两只鞋,这穿着就是 EJB。

Entity

实体 bean,一般是用于 ORM(对象关系映射)中,一个实体类映射成一张表,实体类中的属性对应数据表的字段,一般无业务逻辑代码。

负责将数据库中的表记录映射为内存中的 Entity 对象,事实上,创建一个 Entity Bean 对象相当于创建一条记录,删除一个 Entity Bean 对象会同时从数据库中删除对应记录,修改一个Entity Bean 对象时,容器会自动将 Entity Bean 的状态和数据库同步。

Entity Bean 对象可以手动创建。

应用程序的分层设计

MVC

下图中的 VIEW、ACTION 就属于 View 层,SERVICE 就是 Controller 层,DAO、ORM 就是 Model 层。
在这里插入图片描述

业务分层

上图所示的业务结构,可以分为视图层(VIEW+ACTION),服务层(SERVICE),持久层(DAO)

阿里开发手册关于POJO类的命名规范

1.数据对象:xxxDO,xxx即为数据表名;

2.数据传输对象:xxxDTO,xxx为业务领域相关的名称;

3.展示对象:xxxVO,xxx一般为网页的名称;

4.POJO 是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

总结

数据访问层(DAO):
DAO 将多个 PO 对象封装成 BO 对象返回给 Service

业务逻辑层(Service):
从 BO 对象中抽取所需的数据封装成 DTO 对象返回给 Controller

业务控制层(Controller):
将 DTO 对象直接返回给 View

数据展示层(View):
获取和解释 DTO 对象中的数据,封装成 VO 对象返回给客户端或者模板渲染引擎层

另外一种设计,业务逻辑层中的组件抽取和解释 BO 对象中的数据,封装成 VO 对象返回给控制层的组件,再由控制层将 VO 对象返回给客户端或者模板渲染引擎层。如果对外提供接口访问,则业务逻辑层可以从 BO 对象抽取所需的数据,封装成 DTO 对象返回给调用者。

Busniess Object 和 Domain Objec 相同。
Data Object 和 Persistence Object 相同。

按 MVC 分层
Model:DAO DTO VO PO BO、Service、Manager
Controller:Action
View:模板渲染引擎组件

参考文章

https://www.cnblogs.com/Yale-L/p/11776788.html
https://www.cnblogs.com/lideqiang0909/p/11141007.html
https://www.zhihu.com/question/39651928
http://www.blogjava.net/vip01/archive/2013/05/25/92430.html
https://www.pianshen.com/article/2791497167/
https://blog.csdn.net/lairikeqi/article/details/106081782
https://www.zhihu.com/question/39651928
https://zhuanlan.zhihu.com/p/350964880
https://blog.csdn.net/weixin_39767124/article/details/111784425
https://zhuanlan.zhihu.com/p/102389552

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值