俗话说,没有规矩不成方圆,今天来说一下 Java 中的各种 O(bject)。

为什么会出现这些 O?

我们知道,这些 O 不管叫什么名字,其本质都还是对象(Object),既然本质都一样,为什么非要给他们套上各种马甲?个人认为原因有三:第一,随着编程工业化的发展,需要有一套合理的体系出现。中国人喜欢造神,外国人喜欢造概念,于是 MVC、MVP、MVVM 等编程模型就出现了,为了搭配这些编程模型的使用,需要对 Object 的功能进行划分,于是我们便看到了这些层出不穷的 Object。当然这里并没有批评这些概念的意思。其二,我认为在团队协作编码中,一个好的命名方式是可以节约很多时间成本的。就比如getItemById一眼看去就知道是通过 id 获取一个 item 对象,ItemVO一眼看去就知道是前端透出的 json 对应的对象。其三,如此划分,可以让项目结构更加清楚,不至于出现东一块西一块,对象乱扔的局面。尽可能避免了在多人协作时对象混乱的情况。总的来说,这一切都是为了让软件编程更加合理、更加规范、更加高效。

有哪些 O?

这些 O 有很多衍生出的命名,比如 VO、DO、BO,这里我们把常见的 O 列举出来,然后一一解释。

以下内容参考阿里巴巴 Java 开发手册

  • DO( Data Object):与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
  • PO(Persistant Object):持久对象,一个 PO 的数据结构对应着库中表的结构,表中的一条记录就是一个 PO 对象
  • DTO( Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
  • BO( Business Object):业务对象。由 Service 层输出的封装业务逻辑的对象。
  • AO( Application Object):应用对象。在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
  • VO( View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
  • POJO( Plain Ordinary Java Object):POJO 专指只有 setter/getter/toString 的简单类,包括 DO/DTO/BO/VO 等。
  • DAO(Data Access Objects):数据访问对象,和上面那些 O 不同的是,其功能是用于进行数据操作的。通常不会用于描述数据实体。

一下子给出 8 个常见的 O,光看解释大家可能会有些迷糊,接下来我们从下面这张图入手,带大家直观的感受下,这些 O 的用处。

数据的流向

我们知道,一般情况下,前端是不会凭空造出数据的,因此最后前端展示的数据一定是从数据库中来的,数据的流向通常也是从数据库流向页面。我将其分成三个部分:数据访问、业务处理和业务解释。

  • 1.数据访问:这一部分是用于从数据库中读取数据,将数据记录转换成数据实体也就是 Java 对象,便于操作。
  • 2.业务处理:这一部分是数据流的核心,几乎所有数据的操作都是在这一部分完成的。
  • 3.业务解释:这一部分是用于展示给前端的数据,解释业务体现在某些字段/值是需要经过处理的才会呈现的。

关键点

说了这么多,我们整理出以下关键点。

  • •DAO,是用于操作数据而不是描述数据的。
  • •PO/DO/Entity,其数据结构对应数据表中的一条记录,因此是同一类别的。
  • •BO,可以理解为 PO 的组合,举个简单的例子,假设 PO 是一条交易记录,BO 就可以是一个人全部的交易记录集合对象。
  • •DTO,用于传输数据,可能传递给前端,也有可能传递给其他系统。用于承载数据。
  • •VO,这个最好理解,前端最后需要的数据长什么样,对应的对象就是 VO。

如何使用这些 O?

  说了这么多,在实际的项目中,我们应该如何去使用这些 O?

  首先,这几个概念很完整,但是我们在用的时候是必须按这个来做吗?答案当然不是的,规矩是死的,人是活的。文章开头我们就说了,之所以引入这些概念,很大程度上是为了提升编程体验,而且系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义,适合自己的才是最好的。

省略方案

  1. 1.不管你是叫 PO 还是 DO 还是 Entity,用于描述数据库记录的对象一定要存在,不可省略。
  2. 2.DTO 和 BO 在一般情况下,如果业务系统不是非常复杂,可以考虑省略。
  3. 3.VO 和 DTO,DTO 可以用于将数据传递给前端,如果你不需要删减字段的话,VO 可以考虑省略。

注意事项

领域模型命名规约:

  • •数据对象:xxxDO,xxx 即为数据表名。
  • •数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
  • •展示对象:xxxVO,xxx 一般为网页名称。
  • •POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。

什么是DO,DTO,VO,POJO的更多相关文章

  1. PO、VO、BO、DTO、POJO、DAO

    J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋 ...

  2. PO、BO、VO、DTO、POJO、DAO的区别

    PO: 基本上就是Entity了 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. ---- ...

  3. Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转)

    PO(bean.entity等命名): Persistant Object持久对象,数据库表中的记录在java对象中的显示状态 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作 ...

  4. PO、VO、BO、DTO、POJO、DAO之间的关系

    J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋 ...

  5. 实体类分层命名PO,VO,BO,DTO,POJO,DAO,DO

    一.Java中PO.DO.TO.DTO. VO. BO.POJO .DAO的概念 PO:persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录.好处是可以把一条记录 ...

  6. 关于各种O,DO/BO/DTO/VO/AO/PO

    阿里巴巴Java开发手册 链接:https://pan.baidu.com/s/11I9ViOrat-Bw_HA8yItXwA 密码:x5yi 2. DO/BO/DTO/VO/AO/PO PO(per ...

  7. 当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?

    当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出? 问题: orderStatus 和 payStatus都是枚举类,并且枚举的个数达地10来个,我们不可能在模板页面(jsp/ftl ...

  8. JAVA vo pojo javabean dto区别

    JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...

  9. POJO, DTO, VO, JavaBean的区别

    POJO(plain ordinary java object 简单java对象) POJO是一个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean.EntityBean等 ...

随机推荐

  1. Windows系统appium移动端自动化真机环境搭建

    appium-windows-android环境搭建完成以后,就可以进行真机模式下的appium环境搭建啦!! 准备:把要测试的app下载至本机(小波的是把apk放在桌面上,例如:C:\Users\w ...

  2. 代码注入——c++代码注入

    代码注入之——c++代码注入 0x00  代码注入和DLL注入的区别 DLL注入后DLL会通过线程常驻在某个process中,而代码注入完成之后立即消失. 代码注入体积小,不占内存 0x01  通过c ...

  3. Dynamics CRM Performance Issue when CRM Forms Opening

    事情发生在Dynamics CRM 8.2.2版本,客户新升级到这个版本几个月的时间. 突然有一天,客户反映为什么我们打开CRM Form页面的时候loading的时间这么长呢?大概会需要5-15分钟 ...

  4. Django之模型层第二篇:多表操作

    Django之模型层第二篇:多表操作 一 表关系回顾 ​ 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. ​ 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息 ...

  5. python中可变类型和不可变类型

    1.python中的可变类型和不可变类型 python中的数据类型大致可分为6类:1.Number(数字) 2. String(字符串) 3. Tuple (元组) 4. List(列表) 5. Di ...

  6. 一篇夯实一个知识点系列--python生成

    写在前面 本系列目的:一篇文章,不求鞭辟入里,但使得心应手. 迭代是数据处理的基石,在扫描内存无法装载的数据集时,我们需要一种惰性获取数据的能力(即一次获取一部分数据到内存).在Python中,具有这 ...

  7. 数据可视化之 图表篇(五) PowerBI图表不够炫酷?来看看这个

    现在这个大数据时代,每时每刻.各行各业都在产生多种多样的海量数据,如何简单高效的来理解.挖掘这些数据,发现背后的见解就非常重要. 本文介绍这个图表就可以帮你快速发现海量数据背后的见解,微软研究院打造的 ...

  8. 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!

    写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...

  9. js自定义方法绑定元素事件

    //事件绑定封装 function addEvent(elem, type, handle){ if(elem.addEventListener){ elem.addEventListener(typ ...

  10. java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.CellStyle.setVerticalAlignment(Lorg/apache/poi/ss/usermodel/VerticalAlignment;)V

    项目里引入了两个不同的 POI 版本 ,可能是版本冲突引起的. 但是奇怪的是 用Eclipse在本地就失败,在公共测试 环境就是OK的,同事用的 edea 编译器也是OK的. Caused by: j ...