Java中VO,BO,PO,DO,DTO的区别

news2024/12/30 2:05:51

术语解释:

VO( View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。

BO( Business Object):业务对象。 由Service层输出的封装业务逻辑的对象。

DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。 == PO  == Entity

DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。

AO( Application Object):应用对象。 在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。

POJO( Plain Ordinary Java Object):在本手册中, POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。

Query:数据查询对象,各层接收上层的查询请求。 注意超过2个参数的查询封装,禁止使用Map类来传输。

可以参考下图来理解:

图解:

面对这个图,让我们先从承上启下的DTO开始入手

DTO(Data Transfer Object)数据传输对象

这个传输通常指的前后端之间的传输

DTO是一个比较特殊的对象,他有两种存在形式:

在后端,他的存在形式是java对象,也就是在controller里面定义的那个东东,通常在后端不需要关心怎么从json转成java对象的,这个都是由一些成熟的框架帮你完成啦,比如spring框架

在前端,他的存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体

这也是为什么把他画成横跨两层的原因

这里可能会遇到个问题,现在微服务盛行,服务和服务之间调用的传输对象能叫DTO吗?

我的理解是看情况

DTO本身的一个隐含的意义是要能够完整的表达一个业务模块的输出

如果服务和服务之间相对独立,那就可以叫DTO

如果服务和服务之间不独立,每个都不是一个完整的业务模块,拆开可能仅仅是因为计算复杂度或者性能的问题,那这就不能够叫做DTO,只能是BO

VO(Value Object)值对象

VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,这就叫VO

VO主要的存在形式就是js里面的对象(也可以简单理解成json)

VO和DTO的区别

主要有两个区别

一个是字段不一样,VO根据需要会删减一些字段

另一个是值不一样,VO会根据需要对DTO中的值进行展示业务的解释

举个简单的例子

DTO可能是这样的

{"gender":"男","age":35}

对于业务一来说只需要性别,而且因为是一个古风聊天室,也不能直接展示男,因此经过业务解释业务一的VO是

{"gender":"公子"}

对于业务二来说只需要年龄,而且不需要精确的年龄,因此经过业务解释业务二的VO是

{"age":"30~39"}

PO(Persistant Object)持久对象

PO比较好理解

简单说PO就是数据库中的记录,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO对象

通常PO里面除了get,set之外没有别的方法

对于PO来说,数量是相对固定的,一定不会超过数据库表的数量

等同于Entity,这俩概念是一致的

BO(Business Object)业务对象

BO就是PO的组合

简单的例子比如说PO是一条交易记录,BO是一个人全部的交易记录集合对象

复杂点儿的例子PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,BO是个人网站行为对象

BO是一个业务对象,一类业务就会对应一个BO,数量上没有限制,而且BO会有很多业务操作,也就是说除了get,set方法以外,BO会有很多针对自身数据进行计算的方法

为什么BO也画成横跨两层呢?原因是现在很多持久层框架自身就提供了数据组合的功能,因此BO有可能是在业务层由业务来拼装PO而成,也有可能是在数据库访问层由框架直接生成

很多情况下为了追求查询的效率,框架跳过PO直接生成BO的情况非常普遍,PO只是用来增删改使用

BO和DTO的区别

这两个的区别主要是就是字段的删减

BO对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口,BO可能会含有很多接口对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供

在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成

OK,到这里这些关系基本就理清楚了

等等,DO是什么

DO呢,标题不是还有个DO么?

上面这些概念基本上已经涵盖了全部的流程,DO只是跟其中一个概念相同

但是跟哪个概念相同呢?

现在主要有两个版本

一个是阿里巴巴的开发手册中的定义

DO( Data Object)这个等同于上面的PO

另一个是在DDD(Domain-Driven Design)领域驱动设计中

DO(Domain Object)这个等同于上面的BO

最后,让我们再说说实际应用

这几个概念很完整,我们在用的时候是必须按这个来做吗?

当然不是的,系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义,这些概念全上

上哪些概念,省哪些,我给一些实际建议

1,PO这个没法省,不管叫PO还是Entity,怎么着都得有

2,一些工具类的系统和一些业务不是很复杂的系统DTO是可以和BO合并成一个,当业务扩展的时候注意拆分就行

3,VO是可以第一个优化掉的,展示业务不复杂的可以压根儿不要,直接用DTO

4,这也是最重要的一条,概念是给人用的,多人协作的时候一定要保证大家的概念一致

 

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

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

相关文章

华为新版ENSP PRO模拟器测评:性能表现与功能扩展一览

一、引言 在网络领域不断涌现的新技术和复杂的网络拓扑要求,推动了网络设备模拟器的持续发展和创新。华为作为一家领先的通信技术解决方案提供商,不断致力于为网络工程师和技术从业人员提供更优秀的仿真环境。最近,华为推出了ensp pro模拟器的…

培训报名小程序-订阅消息发送

目录 1 创建API2 获取模板参数3 编写自定义代码4 添加订单编号5 发送消息6 发布预览 我们上一篇讲解了小程序如何获取用户订阅消息授权,用户允许我们发送模板消息后,按照模板的参数要求,我们需要传入我们想要发送消息的内容给模板&#xff0c…

MySQL 建表 及其 表的约束类型

目录 步骤: 1、选择数据库(mydb--自定义数据库) 2、建立班级表 3、建立学生表 4、增加约束删除约束 增添约束: 删除约束: 以班级表和学生表为例说明表的约束类型 步骤: 1、选择数据库(mydb--自定义数据库) 2、建立班级表 …

联发科:2023年7月合并营收317.63亿元新台币,环比下降 16.8%

据联发科公布,2023年7月合并营收为317.63亿元新台币(折合人民币约72.1亿元),环比下降16.8%,同比下降22.3%。而联发科前七个月的累计合并营收为2255.5亿元新台币(折合人民币约512亿元)&#xff0…

整理mongodb文档:改

个人博客 整理mongodb文档:改 求关注,求批评,求进步 文章概叙 本文主要讲的是mongodb的updateOne以及updateMany,主要还是在shell下进行操作,也讲解下主要的参数upsert以及更新的参数。 数据准备 本次需要准备的数据不是很多…

数据库线程池可用线程分析

1.事情的起源 项目在跑的过程中,突然间报没有可用的连接数。这个时候,服务进程还在,但是只要涉及到数据库的操作都会报错。 2.排查的思路 事件发生后,我们重启服务,监控的Connections数是258个,某台机器…

【VSCode】查看二进制文件

1.安装插件Hex Editor 2.打开二进制文件 3.执行Hex Editor命令

day21-110.平衡二叉树

110.平衡二叉树 力扣题目链接 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true …

衡量七个方面,看敌我两方,谁胜算多大?安志强趣讲《孙子兵法》第4讲

衡量七个方面,看敌我两方,谁胜算多大?【安志强趣讲《孙子兵法》第4讲】 【原文】 故校之以计,而索其情。 【注释】 校:jiao,校量、比较的意思。 索:一种解释为探索、搜索,一种解释为…

试用redis的GEO实现附近商户案例

黑马点评 GEO 就是 Geolocation 的简写形式,代表地理坐标。 Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。 常见的命令有: GEOADD:添加一个地理空间信息&#xff…

数据结构入门:队列

目录 文章目录 前言 1.队列 1.1 队列的概念及结构 1.2 队列的实现 1.2.1 队列的定义 1.2.2队列的初始化 1.2.3 入队 1.2.4 判空 1.2.5 出队 1.2.6 队头队尾数据 1.2.7 队列长度 1.2.8 队列销毁 总结 前言 队列,作为一种重要的数据结构,在计算机科学中扮演…

“大数据杀熟”,原来是这样的

前几天和朋友去看电影,票是各自买的,买了票才发现自己比朋友买的票贵。一问才知道,朋友是新注册的账号,价格比我的便宜不少。 这就让我想起来之前看到的一个词“大数据杀熟”。 说现在一些互联网平台和商家已经成佛了&#xff0…

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 时序预测 | …

css中的var函数

css中的var函数 假设我们在css文件存在多个相同颜色值,当css文件越来越大的时候,想要改颜色就要手动在每个旧颜色上修改,这样维护工作非常难进行。 但是我们可以使用变量来存储值,这样可以在整个css样式表中重复使用&#xff0c…

halo --- 上传图片服务器错误

文章目录 问题定位过程1、查看日志 报错的是数据库操作异常2、再次上传一张小一点的图片3、检查nginx的配置文件 原因解决 问题 上传图片时,报错服务器错误(包括上传附件、博客文章插入图片、上传相册) 定位过程 1、查看日志 报错的是数据库…

GEE学习04-

0 回顾 之前学习的内容可以概括为: conda activate gee cd /d e:/geelearn jupyter lab可以在prompt中chrlc停止当前打开的jupyter lab. import ee #ee.Authenticate() import geemap geemap.set_proxy(port 1080) map geemap.Map() map1、视频课学习 之后跟着…

前端技术Vue学习笔记--003

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue生命周期和生命周期的四个阶段1.1、Vue生命周期1.2、生命周期的四个阶段1.3、Vue生命周期函数<font colorred>&#xff08;钩子函数&#xff09; 2、小黑记账本&#xff08;案例&#xff09;3、工程化开发和脚手架…

python-02(入门基础篇2——基本常见语法)

python-02&#xff08;入门基础篇2——基本常见语法&#xff09; 1. 逻辑判断词1.1 布尔类型1.1.1 python为False的情况 1.2 逻辑判断词 not 2. for 语句2.1 语法结构2.2 例子2.2.1 例子1——循环迭代字符串2.2.2 例子2——进行数值循环2.2.2.1 简单循环&#xff08;结合range函…

从Spring源码看创建对象的过程

从Spring源码看创建对象的过程 Spring对于程序员set注入的属性叫做属性的填充、对于set注入之后的处理&#xff08;包括BeanPostProcessor的处理、初始化方法的处理&#xff09;叫做初始化。 研读AbstractBeanFactory类中的doGetBean()方法 doGetBean()方法首先完成的工作是…

MySQL高级-锁+mysql的主从关系(详解02)

目录 1.锁 1.1.Mysql锁问题 1.1.1.锁概述 1.1.2.锁分类 1.1.3.Mysql 锁 1.2.MyISAM 表锁 1.2.1.如何加表锁 1.2.2.读锁案例 1.2.3.写锁案例 1.3.InnoDB 行锁 支持事务 1.3.1.行锁介绍 1.3.2.背景知识 1.3.3.InnoDB 的行锁模式 1.3.4.案例准备工作 innodb 支持事务…