概念不清,会很影响开发中的逻辑性和条理性,进而影响接口设计,代码编写的质量。

网络上大家对这些个概念的探究很多,但终究没有一个统一的说法。

不论哪家解释,我觉得最重要的是: 1)词汇之间的解释统一; 2)词汇之间的联系不冲突,能自圆其说,自成一体。

在自己初步探索后,个人更认同这样的理念(如下)。

若读者凑巧阅读到本文,欢迎一起探讨。

1 POJO := Plain Ordinary Java Object

POJO := Plain Ordinary Java Object

简单的Java对象

POJO ⊇ { PO, DTO, VO }

PO := Persistent Object

持久对象

用途: 用于表示数据库中的一条记录,映射成Java对象

PO仅用于表示数据库数据,无任何其它的数据操作

DTO := Data Transfer Object

数据传输对象

用途: DTO通常用于【不同Web服务之间(RestFul / RPC调用 / WebService调用等)】或【同一服务的不同分层之间的数据传输】 ; 减小数据传输量
一个DTO可以对应多个从存储层返回的PO(Persistent Object)的json数组,这里可以使用AutoMapper来进行自适配。
  • DTO存在的必要性
DTO不是为MVC的视图而存在的模型,而是为了适应来自前端请求而存在的。
DTO模型把来自前端的请求(这个请求不管来自前后端分离的页面,还是mvc的视图页面)封装在DTO模型中,然后服务端处理转换成Entity Framework中的PO模型。

VO := View Object(个人更认同) := Value Object

视图对象/值对象

VO for request and response of users or controller layers

用途: 用于表示一个与前端交互的Java对象;用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
举例:展示层将DTO传送过来男性显示成帅哥(客户端1),或者显示成靓仔(客户端2);将帅哥或者靓仔,转换成男性,以DTO形式请求服务端。
视图模型VO可以对应客户端的网页显示,同样的DTO比如性别男,可以对应多个VO进行显示,即可以对应多个客户端,比如VO1把性别男显示成帅哥,VO2把性别男显示成靓仔等等。
  • 视图对象存在的必要性/ VO VS DTO
如果是一个DTO对应一个VO,则DTO=VO;
但是如果一个DTO对应多个VO,则展示层需要把VO转换为服务层对应方法所要求的DTO,传送给服务层。
从而达到服务层与展示层解耦的效果。
  • VO VS PO:
PO: 纯数据库表记录的完全映射;
VO: 仅包含前端需要展示的数据/属性;(需要对前端/用户屏蔽部分字段;减小数据传输量)

2 BO/DO := Business Object / Domain Object

BO/DO := Business Object / Domain Object

业务对象/领域对象

BO 包含了业务逻辑,常封装了对DAO,RPC等的调用;
可进行PO,VO,DTO之间的转换;
通常属于业务层,但要区别于直接对外提供服务的服务层;
BO提供基本业务单元的基本业务操作,在设计上属于被服务层业务流程调用的对象,一个业务流程可能需要调用多个BO来完成

3 DAO

Database Access Object

数据库访问对象

用途: 用DAO访问数据库,包括增删查改等操作;同POJO一起使用

4 小结


来源网络,并非权威,仅供参考

假定: 我们有一个面试系统,数据库中存储了很多面试题,通过 web 和 API 提供服务。可能会做如下的设计:

  • 数据库表:面试题
  • PO:
  • VO:
  • DTO:
  • DAO:
  • BO:

4 参考文献

[Java EE]辨析: POJO(PO / DTO / VO) | BO/DO | DAO的更多相关文章

  1. java EE中使用PO和VO的注意事项

    1.基本定义  PO(Persistence Object 持久化对象)是直接跟持久层数据库打交道的java Bean (model,entity,bean等叫法都是可以的),里面除了私有的成员变量之 ...

  2. po dto vo bo

    DozerBeanMapper是JavaBean的映射工具,可以进行对象之间相同属性名赋值     关于PO.DTO.VO在分层模型之间的关系:首先在持久层由DAO访问数据库将数据对象封装成PO,然后 ...

  3. java术语(PO/POJO/VO/BO/QO/DAO/DTO)

    一.概念理解 ​ 这些概念用于描述对象的类型:由于java是面向对象的语言:程序的世界就是各个对象之间的"交互":在交互的工程中会存在多个层次,每个层次中所拥有(关注)的内容都是不 ...

  4. DAO DTO VO BO

    DAO叫数据访问对象DTO是数据传输对象DAO通常是将非对象数据(如关系数据库中的数据)以对象的方式操纵.DTO通常用于不同层(UI层.服务层或者域模型层)直接的数据传输,以隔离不同层,降低层间耦合 ...

  5. Java中的几种对象(POJO,PO,DTO,DAO,BO)

    j2ee中,经常提到几种对象(object),理解他们的含义有助于我们更好的理解面向对象的设计思维.     POJO(plain old java object):普通的java对象,有别于特殊的j ...

  6. java的几种对象(PO,VO,DAO,BO,POJO,DTO)解释

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...

  7. Java中DAO/DTO/PO/VO/BO/QO/POJO

    ORM:是Object Relational Mapping(对象关系映射)的缩写. 通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R/M的世界里,有两个基本的也是重要的东东需要了 ...

  8. 【java编程】vo、po、dto、bo、pojo、entity、mode如何区分

    Java Bean:一种可重用组件,即“一次编写,任何地方执行,任何地方重用”.满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员属性 VO valu ...

  9. Java 中 VO、PO、DTO、BO、POJO、DAO 之间的区别与解释

    转载:https://www.cnblogs.com/hunmeng/p/11298680.html VO value object:值对象 通常用于业务层之间的数据传递,由new创建,由GC回收. ...

  10. Java中BO、DAO、DO、DTO、PO、POJO、VO的概念

    在程序开发中,经常会碰到各种专业术语,这里统一做一下解释,有遗漏或理解错误的恳请指正. BO(Business Object)业务对象 主要作用是把业务逻辑封装为一个对象,这个对象可以包括一个或多个其 ...

随机推荐

  1. torch直接更改参数

    使用model.layer1.weight.data.copy_(w1) 其中model是自定义的参数名字,layer1是某个具体的层,使用某个具体的w1来修改

  2. JAVA 在开发中如何选择集合实现类

    先判断存储地类型(一组对象[单列]或者键值对[多列]) 一组对象:Collection接口 允许重复:list 增删多:LinkedList[底层维护了一个双向链表] 改查多;ArratList[底层 ...

  3. Linux系列(8)-添加用户并设置密码

    #添加用户[root@iZm5ehnt0e8indgne1hibuZ ~]# useradd -m linsiyu #设置用户密码[root@iZm5ehnt0e8indgne1hibuZ ~]# p ...

  4. 杨辉三角形实现过程详解-C语言基础

    这一篇要探讨的是"杨辉三角形的实现以及如何人工走循环".涉及的知识点和内容很少,主要是想说明如何看懂循环,如何跟着循环走.属于C语言基础篇. 学习编程的人,在学习的初期,几乎都会接 ...

  5. SQLServer数据库执行时间

    with kk AS( SELECT TOP 2000 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.tot ...

  6. Realtek 平台一些乱七八糟的编译环境设置

    1. 129x 系列之后的就推荐用ubuntu 16.04了 省去一些GCC ,tar,quilt 等问题 Android 平台: sudo apt-get install u-boot-tools ...

  7. ArrayList学习

    核心源码 package java.util; import java.util.function.Consumer; import java.util.function.Predicate; imp ...

  8. winform导出excel报'object' does not contain a definition for 'get_Range'的问题

    现手上有个老项目采用.net framework3.0开发,改成4.0后,excel导出报'object' does not contain a definition for 'get_Range'的 ...

  9. Fiddler之常用的操作

    Fiddler操作 一.首次安装 1.设置https Tools → Options → https 第一次选择安装证书,如图 2.无法正常显示https请求 重置所有证书,重置后会重新提示安装证书, ...

  10. 提供离线chrome谷歌浏览器插件crx的网站有

    crx4:http://www.crx4.com/ 极简插件:https://chrome.zzzmh.cn/index 扩展迷:https://www.extfans.com/ 浏览器插件下载中心: ...