Java架构中VO、DTO、DO、BO的区别与联系(超详解)

news2024/11/16 19:27:39

VO、DTO、DO、BO的区别与联系

  • 前言
  • 一、概念
    • 1、VO (View Object)
    • 2、DTO(Data Transfer Object)
    • 3、DO(Data Object)
    • 4、BO(Business Object)
  • 二、为什么会存在Vo?
  • 三、总结



前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!

一、概念

在Java编程中,VO、DTO、DO、BO这四个术语都代表了不同的对象类型,它们之间的区别与联系如下:

1、VO (View Object)

VO (View Object),用于表示一个与前端进行交互的视图对象,它的作用是把某个指定页面(或组件)的所有数据封装起来。实际上,这里的VO只包含前端需要展示的数据,对于前端不需要的数据,比如数据创建和修改的时间等字段,出于减少传输数据量大小和保护数据库结构不外泄的目的,不应该在VO 中体现出来。

2、DTO(Data Transfer Object)

DTO(Data Transfer Object),用于表示一个数据传输对象,DTO通常用于展示层(Controller)和服务层(Service)之间的数据传输对象。DTOVO概念相似,并且通常情况下字段也基本一致。但 DTOVO 又有一些不同,这个不同主要是设计理念上的,比如 API 服务需要使用的 DTO就可能与 VO 存在差异。

3、DO(Data Object)

DO(Data Object),持久化对象,它跟持久层(Dao)的数据结构形成一一对应的映射关系。如果持久层是关系型数据库,那么数据库表中的每个字段就对应PO的一个属性,常是entity实体类。

4、BO(Business Object)

BO(Business Object):业务对象,通常用于业务逻辑层,代表了业务逻辑的实现。BO主要负责业务逻辑的处理,包括数据校验、数据处理、业务逻辑处理等。BO可以调用多个DO,将多个DO组合起来,形成一个完整的业务流程。

二、为什么会存在Vo?

项目中,看到别人直接把DTO,写上swagger注释,直接返回前端。那么思考一下,为什么不建议这么做,不直接把DTO返回给前端。

从开发过程讲,前后端首先会以voparam作为返回、传参的协议的定义,再定义协议之前,都没有实际的业务逻辑的处理,也就不会存在dto

从项目的整体考虑,如果把dto作为传给前端的对象,那么service层返回dtoservice层的所有的方法不一定都是public方法,也有private方法,如果private方法也返回dto,那么也就是说有些dto不是提供给前端的,有些是给前端的,这样就会乱,没有了隔离性。

从字段的修改来说service层的方法是可以共用的,一个service方法返回的dto,可能会被很多个controlller方法使用到,即使目前不会,将来也可能会,dto会有很多参数,比如包含了主表信息,子表信息,而传给前端的vo只有dto的一部分信息,而且不同请求给前端看到的数据不一样,所以dto是共用的,vo是个性化的,如果直接把dto提供给前端,将会导致耦合性非常大,一旦一个接口的需求变了,修改了dto,增加了一个字段,将会导致接口直接把这个新增的字段返回给了前端,导致(接口输出数据多余,和不安全性)。同理,如果由于某个需求,把dto展示给前端的接口说要删除某一个字段,那么因为这个dto被很多接口引用,一删除就会导致出问题。

所以,总整体性结构而言:vo是必须存在的,不能把dto直接返回给前端。高内聚,低耦合。一般的数据传递是,前端传递VO给接口(Controller),接口将VO转为DTO传递给service,service将DTO分解为DO,调用领域服务进行调度,然后逆向转为VO或者其他的返回结果,传递给前台。

三、总结

总的来说,VO、DTO、DO、BO是分层架构中的不同对象,每个对象在各自的层次中承担着不同的角色,各自有自己的特点和用途。在实际开发中,要根据业务需求和架构要求,灵活使用这些对象,使得系统的耦合性和复杂度得到合理的控制和降低。

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

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

相关文章

深入理解 node 中的文件流

为什么要使用文件流 想象这样一个场景,我要处理一个 10G 的文件,但我的内存大小只有 2G,该怎么办? 我们可以分 5 次读取文件,每次只读取 2G 的数据,这样就可以解决这个问题,那么这个分段读取的过…

HTML基本标签介绍

HTML的基本认识! 文章目录 HTML基本标签介绍1. HTML是什么?1.1 HTML代码的样子1.2 HTML文件的展示1.3 VSCode配置 2. HTML常用标签介绍2.1 注释标签2.2 标题标签2.3 段落标签2.4 换行标签2.5 格式化标签2.6 图片标签2.7 超链接标签2.8 表格标签2.9 列表标…

Windows下 ffmpeg 的 “Protocol not found“ 的解决

文章目录 1. 问题描述2. 排查方法记录2.1 检查代码中编码器是否安装2.2 确定ffmpeg版本号2.3 打印编译参数2.4 查看运行中调用dll 1. 问题描述 调用ffmpeg库中,如果使用 avformat_open_input 打开返回 -1330794744,使用 av_strerror char buf[1024]{0};int result …

JavaScript高阶项目—组件化的可编辑表格

1. 任务要求 JSON数据,表格中数据来自服务端,由JSON格式表示。通过JSON数据生成可编辑表格,并且灵活配置可编辑得到数据列。输入数据时打开开发者模式有提示,并且设置判断,要求输入正确的成绩。要求表格的可编辑列,计…

新鲜热乎的春招面经汇总

作者:阿秀 校招八股文学习网站:https://interviewguide.cn 这是阿秀的第「263」篇原创 小伙伴们大家好,我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈,目前已经超过 2300 小伙伴加入!去年认真准备和走下来的基…

高精度DEM(12.5m)数据以及下载方式介绍

一、 DEM代表数字高程模型,是一种数字地形模型,用于表示地球表面的海拔高度。 DEM数据可以通过多种方法获得,包括激光雷达、遥感技术和GPS测量等。 DEM数据通常以栅格形式呈现,每个栅格单元包含一个高度值。DEM数据可以用于许多…

gitee如何上传自己的代码

1,右击你要上传的项目,选择Git bash Here 2,接着输入 git init 此时你会发现你的当前文件夹会多了一个.git文件夹 点击.git文件夹,进入之后发现是这样,然后用记事本打开config文件 3,发现是这样,然后我们要配置一个用…

简单科普视频云

1. 本文目的 每当我连写几篇行业分析的虚文以后,我都会做一两篇技术科普和产品分析的硬核分享,证明我是脚踏实地的戏说江姗,而非云里雾里的胡乱推倒。 其实是写硬核分享应者寥寥,反倒是写一些虚文很多人看热闹。 最近看到PPIO王闻…

数字化转型导师坚鹏:如何制定企业数字化转型年度培训规划

如何制定企业数字化转型年度培训规划 ——以推动企业数字化转型战略落地为核心,实现知行果合一 课程背景: 很多企业都在开展企业数字化转型培训工作,目前存在以下问题急需解决: 缺少针对性的企业数字化转型年度培训规划 不清…

双目视觉(七)稀疏双目匹配

系列文章 双目视觉(一)双目视觉系统双目视觉(二)双目匹配的困难和评判标准双目视觉(三)立体匹配算法双目视觉(四)匹配代价双目视觉(五)立体匹配算法之动态规…

测试1:概念

1.需求 用户需求:该需求一般比较简略。(一句话) 软件需求:或者功能需求,详细描述开发人员必须实现的软件功能(一个文档) 2.BUG 说明是存在的并且正确,程序和规格说明之间不匹配是错误 3.软件生命周期 从诞生到停服 需求分析,计划,设计,编码,测试,运行维护 需求分析:分析…

出海的中国企业,为什么有80%都选择了这家云服务商?

对于想要出海的中国企业来说,什么样的云服务才是他们的最佳选择? 中国企业出海驶入快车道 中国企业的出海大潮,多年来一直方兴未艾,并且得到了政府部门的大力支持。这股“走出去”的热潮,一方面对内有利于推动产业升级…

均摊时间复杂度

均摊时间复杂度,它对应的分析方法,摊还分析(或者叫平摊分析) 均摊时间复杂度应用的场景比它更加特殊、更加有限 // array表示一个长度为n的数组// 代码中的array.length就等于nint[] array new int[n];int count 0;void insert…

电子时钟实现

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 利用汇编语言实现一个可以在显示器上显示时、分、秒的电子时钟,并能提供设置闹钟时间、选择闹钟铃声功能。 问题描述 利用汇编语言实现一个可以在显示器上显示时、分、秒的电子时钟,并能提供设置闹钟时间…

【Go编程语言】 Go和Goland的安装

Go和Goland的安装 文章目录 Go和Goland的安装一、 Goland官网二、打开Goland,并输入激活码 GO官网地址:https://golang.google.cn/ go中文网地址:https://studygolang.com/dl 安装完成得到的目录 环境变量配置: 1.新建变量 变…

【Gin框架深度解析】路由实现原理,让你彻底掌握Gin中路由的奥秘!

文章目录 Gin路由1、基本路由2、Restful风格的API3、API参数4、URL参数5、表单参数6、上传单个文件6.1、上传特定文件 7、上传多个文件8、路由分组9、404页面处理10、路由原理 Gin路由 1、基本路由 ​ 举一个例子: package mainimport ("net/http"&quo…

ARM嵌入式编译器控制诊断信息(warning/error)

ARM编译器以警告(warning)和错误(error)的形式来提供编译诊断信息,并且用户可以通过一些命令行选项,来控制这些warnings和errors的打开或者关闭。编译器会在程序编译和链接过程中将遇到的warnings和errors在…

开关电源基础03:正激和反激开关电源拓扑(1)-正激拓扑

说在开头:关于薛定谔的波动方程(2) 全新的量子理论诞生不到一年,很快面临着粒子和波动的内战。矩阵力学从直接观测到的原子谱线出发,引入矩阵的数学工具,建立了整个新力学的大厦;它强调观测到的…

大数据Doris(十三):Duplicate数据模型以及聚合模型的局限性

文章目录 Duplicate数据模型以及聚合模型的局限性 一、Duplicate数据模型 二、聚合模型的局限性 Duplicate数据模型以及聚合模型的局限性 一、Duplicate数据模型 在某些多维分析场景下,数据既没有主键,也没有聚合需求,只需要将数据原封不…

JDK17新特性之--新的Compact Strings(JEP 254)

前言 JDK9将String底层的数据结构从private final char value[];改成了private final byte[] value; , JEP 254: Compact Strings(紧凑字符串),这要修改的目的就是为了节省空间1。我们先看一下JDK9和JDK8中String源码的变化。 JDK9中String源码&#xf…