[Java EE]辨析: POJO(PO / DTO / VO) | BO/DO | DAO
概念不清,会很影响开发中的逻辑性和条理性,进而影响接口设计,代码编写的质量。
网络上大家对这些个概念的探究很多,但终究没有一个统一的说法。
不论哪家解释,我觉得最重要的是: 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的更多相关文章
- java EE中使用PO和VO的注意事项
1.基本定义 PO(Persistence Object 持久化对象)是直接跟持久层数据库打交道的java Bean (model,entity,bean等叫法都是可以的),里面除了私有的成员变量之 ...
- po dto vo bo
DozerBeanMapper是JavaBean的映射工具,可以进行对象之间相同属性名赋值 关于PO.DTO.VO在分层模型之间的关系:首先在持久层由DAO访问数据库将数据对象封装成PO,然后 ...
- java术语(PO/POJO/VO/BO/QO/DAO/DTO)
一.概念理解 这些概念用于描述对象的类型:由于java是面向对象的语言:程序的世界就是各个对象之间的"交互":在交互的工程中会存在多个层次,每个层次中所拥有(关注)的内容都是不 ...
- DAO DTO VO BO
DAO叫数据访问对象DTO是数据传输对象DAO通常是将非对象数据(如关系数据库中的数据)以对象的方式操纵.DTO通常用于不同层(UI层.服务层或者域模型层)直接的数据传输,以隔离不同层,降低层间耦合 ...
- Java中的几种对象(POJO,PO,DTO,DAO,BO)
j2ee中,经常提到几种对象(object),理解他们的含义有助于我们更好的理解面向对象的设计思维. POJO(plain old java object):普通的java对象,有别于特殊的j ...
- java的几种对象(PO,VO,DAO,BO,POJO,DTO)解释
一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...
- Java中DAO/DTO/PO/VO/BO/QO/POJO
ORM:是Object Relational Mapping(对象关系映射)的缩写. 通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R/M的世界里,有两个基本的也是重要的东东需要了 ...
- 【java编程】vo、po、dto、bo、pojo、entity、mode如何区分
Java Bean:一种可重用组件,即“一次编写,任何地方执行,任何地方重用”.满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员属性 VO valu ...
- Java 中 VO、PO、DTO、BO、POJO、DAO 之间的区别与解释
转载:https://www.cnblogs.com/hunmeng/p/11298680.html VO value object:值对象 通常用于业务层之间的数据传递,由new创建,由GC回收. ...
- Java中BO、DAO、DO、DTO、PO、POJO、VO的概念
在程序开发中,经常会碰到各种专业术语,这里统一做一下解释,有遗漏或理解错误的恳请指正. BO(Business Object)业务对象 主要作用是把业务逻辑封装为一个对象,这个对象可以包括一个或多个其 ...
随机推荐
- JAVA实现中英文混合文字友好截取功能
package com.xxx.utils; import com.google.common.collect.Lists; import java.util.List; /** * 字符工具类 */ ...
- char *setlocale(int category, const char *locale)
category -- 这是一个已命名的常量,指定了受区域设置影响的函数类别. LC_ALL 包括下面的所有选项. LC_COLLATE 字符串比较.参见 strcoll(). LC_CTYPE 字符 ...
- webstrom破解
1.下载webstrom补丁 链接:https://pan.baidu.com/s/1I93J_JOlbZzkoqV4EsJlpQ 提取码:kopn (永久有效) 2.将补丁复 ...
- linux 离线安装jdk
系统版本:centos7.8 | jdk版本:1.8 jdk版本:jdk-8u5-linux-x64.rpm 点击下载 提取码: ud1r 检查系统是否已经有JDK,输入如下命令查看是否系统中是否已安 ...
- C语言历史与C++的区别
前期演变: C语言的前身是1967年由Martin Richards为开发操作系统和编译器而提出的两种高级程序设计语言BCPL和B.BCPL.Ken Thompson在BCPL的基础上,提出了新的功能 ...
- VUE-使用touchstart、touchmove、touchend实现拖拽卡片列表,实现更新排序功能
感谢本文参考地址,原文解析更加清晰如有需要请移步:https://blog.csdn.net/weixin_40400844/article/details/114849253 怕原链接失效,将代码拷 ...
- PHP判断0和空的方法
可以兼容,传参数,或者不参数与0的判断 if ( isset($data['other_id']) && (!empty($data['other_id']) || is_nume ...
- 前端复习之css
1.css概述 1 1.CSS3概述 2 1.问题 3 1.设置页面中所有的文本颜色为红色 4 2.设置页面中所有div的文本的颜色为蓝色 5 3.将所有的div的文本的颜色改为黄色 6 7 HTML ...
- 安装DevExpress VCL,使用时报错 某单元文件找不到的解决办法
1.新建一个工程做为测试 2.点击projecct-->options 3. 4. 5.在上4图上的红框内加入packages文件 dxCoreRS27;dxGDIPlusRS27;dxComn ...
- C语言基础题 22年5月
(十六进制 %x 20.0f是%f long 是%ld unsigned int %#o ) 编程题: 整数浮点数的上溢下溢 strcpy函数代码 int search(char *s, ch ...