VO、DTO、DO、BO、PO

news2025/1/20 3:47:15

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • VO、DTO、DO、BO
    • 1.概念
        • 阿里Java开发手册分层领域模型:
    • 2. VO 和 DTO 使用场景
        • 以下是一个使用VO和DTO的典型案例:
    • 3.BO和DTO的区别
  • 案例


VO、DTO、DO、BO

  • POJO的定义是无规则简单的对象,在日常的代码分层中pojo会被分为VO、BO、 PO、DTO。通过各层POJO的使用,有助于提高代码的可读性和可维护性。

概念看似简单,但是想区分好或者理解好也不容易
在这里插入图片描述
在这里插入图片描述

1.概念

  • Pojo(Plain Ordinary Java Object):纯的传统意义的java对象 最基本的javaBean只有属性加上属性的get和set方法。Pojo可以转化为PO、DTO、VO。比如POJO在传输过程中就是DTO。

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

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

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

  • DAO(Data Access Object)数据访问对象 是sun公司的一个标准j2ee设计模式的接口之一,负责持久层的操作。Dao和其他的O区别最大,基本没有互相转化的可能性和必要,主要用来封装对数据的访问,而不是对数据库的访问。

  • PO(Persistant Object)持久层对象,对应数据库中表的字段,数据库中表中的记录在java对象中的显示状态,即一个PO就是数据库中的一条记录。

  • BO(Business Object):业务对象,就是从现实世界中抽象出来的有形或无形的业务实体。

阿里Java开发手册分层领域模型:

在这里插入图片描述
在这里插入图片描述

2. VO 和 DTO 使用场景

在软件开发中,VO和DTO都是常见的数据传输对象,但它们的使用场景有所不同。

VO(View Object)

  1. 通常用于与前端交互,封装前端调用某个接口之后所需的所有数据
  2. 在前后端分离的时代,VO主要应用于表示视图层的类

DTO(Data Transfer Object)

  1. 则主要应用于数据传输层,特别是在Controller层和Service层。

  2. 在Controller层,DTO用于接收参数,无论是单个参数还是多个参数,都可以通过创建一个DTO对象来进行接收。

  3. 使用DTO传参相比使用注解(@RequestParam等)具有更高的可读性和维护性。在Service层,处理复杂的逻辑后,将处理好的DTO进行copyBean即可无伤转换为持久化对象(Bo)。

总的来说,VO和DTO都是为了实现程序中的数据传输和交互,但它们的使用场景不同。前端与后端交互时,使用VO;而在服务层之间传输数据时,使用DTO

以下是一个使用VO和DTO的典型案例:

假设你正在开发一个电子商务网站,用户可以在网站上购买商品。在这个场景中,你可以创建以下对象:

  • UserVO:这是一个视图对象,用于展示用户信息。它可能包括用户名、电子邮件、地址等信息。这个对象主要用于前端页面,例如用户登录页面和购物车页面。
  • UserDTO:这是一个数据传输对象,用于在服务层之间传输用户数据。它可能包括用户ID、用户名和购买商品的数量等信息。这个对象主要用于在Controller层和Service层之间传输数据,例如在用户提交订单时,Controller层会将UserDTO传递给Service层进行处理。

在前端页面上,例如用户登录页面,你可能会创建一个表单,用户需要输入用户名和密码。当用户提交表单时,前端会将用户输入的数据传递给后端。在后端,Controller层会接收到一个UserDTO对象,该对象包含用户输入的用户名和密码等信息。然后,Controller层将UserDTO传递给Service层进行处理。

在Service层,Service层会根据业务逻辑对UserDTO进行处理,例如验证用户名和密码是否正确,并返回一个UserDTO表示处理结果。如果验证失败,UserDTO将包含错误信息,例如“用户名或密码不正确”。然后,Controller层将根据返回的UserDTO做出相应的处理,例如显示错误信息给用户。

在整个过程中,前端只需要关心UserVO对象,而服务层只需要关心UserDTO对象。因此,通过使用VO和DTO,你可以实现前端和后端的解耦,使程序更加清晰和易于维护。

3.BO和DTO的区别

主要区别为字段的删减

  • BO对内,为了进行业务计算,需要辅助数据,或者是一个业务有多个对外的接口,BO可能会含有很多接口对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成。

案例

有一个博客系统,数据库中存储了很多篇博客。我们会做如下设计:

  • 数据库表:表中的博客包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。

  • PO:包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。(与数据库表中的字段一样。)

  • VO:在客户端浏览器展示的页面数据,博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客URL、下一篇博客URL。

  • DTO:在服务端数据传输的对象,编号、博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客编号、下一篇博客编号。

  • DAO:数据库增删改查的方法,例如新增博客、删除博客、查询所有博客、更新博客。

  • BO:基本业务操作,如管理分类、管理标签、修改博客状态等,是我们常说的service层操作。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

分享两个版本的数字孪生技术栈,都是AI回答的,较为精准

版本一: 数字孪生应用到的技术栈包括但不限于: 3D建模:数字孪生需要建立虚拟的三维模型,因此需要使用3D建模软件如AutoCAD、SketchUp、3ds Max等。 数据采集:数字孪生需要采集大量实时的物理数据,如传感…

为什么从没有负值的数据中绘制的小提琴图(Violin Plot)会出现负值部分?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 小提琴图(Violin Plot) 是一种用于展示和比较数据分布的可视化工具。它结合了箱形图(Box Plot)和密度图(Kernel Density Plot)的特…

hive load data未正确读取到日期

1.源数据CSV文件日期字段值: 2.hive DDL语句: CREATE EXTERNAL TABLE test.textfile_table1(id int COMMENT ????, name string COMMENT ??, gender string COMMENT ??, birthday date COMMENT ????,.......) ROW FORMAT SERDE org.apache.…

QT中事件过滤器

Qt添加事件过滤器,设置拖放listWidget、TreeWidget、TableWidget控件。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this)…

UML---活动图

活动图概述 活动图(Activity Diagram)是UML(Unified Modeling Language,统一建模语言)中的一种行为建模工具,主要用于描述系统或业务流程中的一系列活动或操作。活动图通常用于描述用例中的行为&#xff0c…

SimpleDateFormat为什么是线程不安全的?

目录 在日常开发中,Date工具类使用频率相对较高,大家通常都会这样写:这很简单啊,有什么争议吗?格式化后出现的时间错乱。看看Java 8是如何解决时区问题的:在处理带时区的国际化时间问题,推荐使用…

[创业之路-88/管理者与领导者-128]:企业运行分层模型、研发管理全视野

目录 一、企业分层模型 1.1 愿景层 1.2 战略目标层 1.3 战术方法层 1.4 市场业务层 1.5 项目执行层 1.6 资源层 二、研发全视野、全流程 2.1 市场 2.2 战略规划 2.3 产品研发 2.3.1 概述 2.3.2 项目管理 2.3.3 研发业务管理(研发经理*N) – 管技术流程…

2024护眼大路灯哪个牌子好?6个挑选妙招助你选择优质落地灯!

如果大家平常关注大路灯,应该都会注意到一个情况——它确实大受众多用户的喜爱以及专业人士的认可,但是关于它的伤眼案例却从未减少。之所以如此矛盾,主要是因为市面上有太多的不专业大路灯,它们的选材用料以及品质非常糟糕&#…

Spring Boot 笔记 028 文章列表

1.1 导入中文语言包 1.2 显示文章分类 //回显文章分类 import { articleCategoryListService } from /api/article.js const articleCategoryList async () > {let result await articleCategoryListService();categorys.value result.data; }articleCategoryList() 1.3…

蓝牙BLE安全-SSP简单安全配对

SSP的配对过程由于可以根据设备的IO能力选择不同的关联模型,因此十分灵活,其提供了四种方式:Numeric Comparison、Passkey Entry、Just Works以及Out of Band (OOB) 。这里关联方式的选择实质上对后面的流程是有一定影响的,如Just…

Python实例|电商API接口数据采集的请求|爬取商品详情描述价格评论

近年来,随着互联网的发展,越来越多的数据以网页的形式存在于各个网站上。对于数据分析师、研究员或者仅仅是对数据感兴趣的人来说,如何高效地提取和分析网页数据成为了一项重要的技能。Python作为一门强大的编程语言,通过其丰富的…

【鸿蒙系统学习笔记】状态管理

一、介绍 资料来自官网:文档中心 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状…

HTML的特殊字符

HTML的特殊字符 有些特殊的字符在 html 文件中是不能直接表示的&#xff0c;例如: 空格&#xff0c;小于号(<)&#xff0c;大于号(>)&#xff0c;按位与(&)。 空格 示例代码&#xff1a; 运行结果&#xff1a; 由于html 标签就是用 < > 表示的&#xff0…

原创个人java开源项目发布maven全球中央仓库详细过程示范和遇到的问题解决办法

文章目录 java项目上传到maven全球中央仓库&#xff08;原创个人开源项目发布maven中央仓库详细过程示范&#xff09;需求背景第一步 注册sonatype账号第二步 登录sonatype账号并申请新建项目第三步 准备个人GPG数字签名并发布到ubuntu第四步 准备maven配置第五步 修改项目配置…

java数据结构与算法刷题-----LeetCode155. 最小栈

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 1. 法一&#xff1a;使用辅助最小栈 解题思路&#xff1a;时间复杂度O(1)…

【Git】Gitbash使用ssh 上传本地项目到github

SSH Git上传项目到GitHub&#xff08;图文&#xff09;_git ssh上传github-CSDN博客 前提 ssh-keygen -t rsa -C “自己的github电子邮箱” 生成密钥&#xff0c;公钥保存到自己的github的ssh里 1.先创建一个仓库&#xff0c;复制ssh地址 git init git add . git commit -m …

机器学习之梯度下降法直观理解

形象化举例&#xff0c;由上图所示&#xff0c;假如最开始&#xff0c;我们在一座大山上的某处位置&#xff0c;因为到处都是陌生的不知道下山的路&#xff0c;所以只能摸索着根据直觉&#xff0c;走一步算一步。在此过程中&#xff0c;每走到一个位置的时候&#xff0c;都会求…

shell运行原理

前言 前一段时间由于身体的缘故和一些琐事&#xff0c;好久没有更新Linux的博文了。从本篇博文开始会接着以前的内容一直持续更新&#xff01; 本期类容介绍 为什么存在shell外壳&#xff1f; 什么是shell外壳&#xff1f; shell外壳是如何工作的&#xff1f; 一、为什么存在…

领域驱动设计(Domain Driven Design)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、场景和要求二、领域模型关键词1.领域2.子域3.通用语言4.限界上下文5.领域模型6.实体和值对象7.聚合根8.领域服务9.领域事件 总结 前言 Domain Driven Desi…

垂起固定翼无人机基础知识,垂起固定翼无人机应用前景,垂起固定翼无人机优缺点分析

无人机定义与类型 无人机&#xff0c;也称为无人驾驶飞行器&#xff0c;是一种无需人工直接操作的航空器。根据其用途、设计及技术特点&#xff0c;可以分为多种类型。垂起固定翼无人机是其中的一种&#xff0c;它具有垂直起降的能力并采用固定翼设计以提高飞行效率和稳定性。…