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

文章目录

  • DO(Domain Object)
  • DO(Data Object)
  • PO
  • VO
  • BO
  • DTO
  • POJO
  • DAO
  • JavaBean
  • EJB
  • Entity
  • 应用程序的分层设计
    • MVC
    • 业务分层
  • 阿里开发手册关于POJO类的命名规范
  • 总结
  • 参考文章

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

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

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

相关文章

openshift_OpenShift Origin中的Kubernetes Spark运算符(第1部分)

openshift本系列有关Radanalytics.io的Kubernetes Spark运算符 OpenShift起源 。 它是一个开源的运营商来管理 Apache Spark集群和应用程序。 为了在OpenShift Origin上部署操作员,第一次需要为其克隆GitHub存储库: git clone https://github.com/rad…

小程序二级页面tabbar_小程序页面推广踩坑记

前几天,团队里有个小伙伴遇到一个问题,卡壳了大半天。我觉得这个例子值得拿出来分享给大家。希望大家以后遇到类似的问题能顺利绕过这种坑。业务场景很常见,就是为了配合小程序中特定页面的推广,区分推广渠道和人员,逐…

转移指令jmp和跳转指令call

【-1】写在前面 以下内容文字描述来自于 王爽老师的《汇编语言》教材,建议大家都买一本,哈哈。不是我打广告,确实人家写的好,应该支持。我只是附上了自己的图片和理解而已。 【0】先上干货 只修改ip,称为段内转移&a…

jmeter负载测试测试_使用Apache JMeter负载测试Web应用程序

jmeter负载测试测试Apache JMeter是用于模拟Web应用程序上的用户负载以测试性能的出色工具。 您可以通过指定用户数量和请求间隔来轻松地构建测试计划,然后JMeter将为每个用户生成一个线程并访问您的Web应用程序。 在测试结束时,您将获得一份性能摘要报告…

Windows下安装Nutch

Nutch安装 一、需求部份 a) Nutch是Java开发的所以需要下载Java JDK 下载地址http://java.sun.com/javase/downloads/index.jsp b) Nutch的演示搜索页面是Jsp的需要Tomcat做服务器 下载地址:http://jakarta.apache.org/tomcat/ c) Nutch的脚本都是用Linux的Shell写的…

python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程

以下脚本encrypt_me.py(modified from another post)使用gpg加密自身并以装甲形式打印出密文.但它只适用于python2.7但不适用于python3?你知道它在python3上运行时有什么问题吗?import subprocessimport shleximport osimport sysin_fd, out_fd os.pipe…

程序编码(机器级代码+汇编代码+C代码+反汇编)

【-1】相关声明 本文总结于csapp; 了解详情,或有兴趣,建议看原版书籍;【0】程序编码 GCC调用了一系列程序,将源代码转化成可执行代码的流程如下: (1)C预处理器扩展源代码&#xf…

angular1.2.27_Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

angular1.2.27“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 如果您已经成为Java开发人员超过15年,那么您可能还记得何时…

ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发

在知乎上看过不少大牛写的自动驾驶技术介绍文章,大多谈到的是AI, Deep Learning, Computer Vision等等感知(Perception)层面的。但在各个传感器(雷达、摄像头、激光雷达等)探测到目标信息及周围环境后,车辆该如何做出反应?自动驾驶的大脑该怎…

MyEclipse详细使用教程

第一部分MyEclipse的基本使用 一.提示:MyEclipse的透视图按钮:可以切换不同的透视图(位于右上角) 1.建立一个工程 ----File—new—project—选项含有Javaproject,webproject等等—输入工程名字如myproject&…

控制语句(if-else+循环+switch)汇编规则

【1】说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出)ZF:零标志SF:符号标志(结果为负数)OF:溢出标志 (补码溢出, 有符号溢出&#xf…

zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

zxing qr区域判断在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像。 QR码生成 下面的代码使用Zxing库创建一个表示QR Code的java.awt.image.BufferedImage对象: public static BufferedImage getQRCode(String …

审批流_怎样让审批工作流和应用数据分离?

在企业行政管理中,审批是最常遇到的场景。传统管理中,人们会有纸张审批,而现在市场上已有大量的线上审批软件,他们帮助企业完成审批电子化,审批速度更快,信息也能留档。然而大部分审批软件都不够灵活&#…

java 反射api_反射是最重要的Java API

java 反射api前几天我在想-这是最重要的Java API。 哪种SE和EE API可以使大多数Java生态系统成为可能,而哪些API不能重新创建为第三方库。 正如您可能已经猜到标题一样,我认为它是Reflection API 。 是的,它不可避免地是每个项目的直接或间接…

前端校验表单项内容是否合规的JS脚本代码

用途:校验ip地址的格式 输入:strIP:ip地址 返回:如果通过验证返回true,否则返回false; */ function isIP(strIP) { if (isNull(strIP)) return false; var re/^(\d).(\d).(\d).(\d)$/g //匹配IP地址的正则表达式 if(r…

过程(栈帧结构是干货)

【0】写在前面 过程(栈帧结构是干货);本文总结于csapp, 加上自己的理解;【1】栈帧结构 每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。 过程调用&#xf…

山东小学信息技术课本 python 五年级_山东教育出版社小学信息技术五年级上册教案 全册.doc...

山东教育出版社小学信息技术五年级上册教案 全册电子备课教学案学年度 第一学期学科 信息技术年级 五年级姓名教师个人备课情况统计一览表 项目?精备课二次备课课堂检测课后反思交流平台 篇数月份第( )月第( )月第( )月第( )月备注:为便于自查,此表由教…

apache ranger_Apache Ranger插件的美丽简洁

apache ranger如果您在这里,您已经知道什么是Apache Ranger 。 这是在Hadoop框架中管理安全性的最流行(即使不是唯一)的方法。 它与Active Directory,Kerberos和其他各种身份验证集成在一起,但是我认为最有趣的功能是其…

可重定位目标文件

【0】GCC将源代码转化成可执行代码的流程 (1)C预处理器cpp扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏;(2)编译器ccl产生两个源代码的汇编代码:*.s;&a…

经典颜色的RGB值

红 RED    品红Magenta(热情)    CMYK:C15 M100 Y20 K0   RGB: R207 G0 B112    洋红Carmine(大胆)   CMYK: C100 M0 Y60 K10   RGB: R215 G0 B64    宝石红Ruby(富贵)   CMYK…