PO、DTO、VO、BO到底是什么用在哪一层

news2024/11/18 12:39:38

简介 

  • PO (Persistant Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
  • DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
  • BO(Business Object):业务对象,可以由 Service 层输出的封装业务逻辑的对象。
  • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
  • POJO (Plain Ordinary Java Object)是 PO/DTO/BO/VO 的统称
     

PO 持久层对象


与数据库的表、视图、或者是查询结果的列一一对应。PO仅用来展现数据,类中只包含属性和get/set方法,而不会有修改数据库的方法。

DAO 层的返回和多参数的接收都是用的PO对象封装。

DTO 数据传输对象


DTO最早由EJB的设计模式引入,主要是为了解决两个问题:

可以在不同的web服务间传输,因此需要可以序列化,实现serializable接口。
把相关的数据都组合到一个对象中,减少网络调用的次数,从而提高分布式调用的性能和降低网络负载。
在Dubbo类型的分布式框架中,微服务间的调用使用DTO传输数据也是非常适合的。

但在Springboot、Spring Cloud框架中,泛指用于Controller层与Service层之间的数据传输对象。

为什么有了PO,还要添加一个DTO?
举个例子,一张数据表中有100列,则对应的PO同样有100个属性。但是,有一个服务调用只需要其中的10个属性,此时我们可以创建一个只有10个属性的DTO返回给调用者。同时也避免了数据表结构给客户端,使用数据表结构和调用结果解偶。

BO 业务对象


封装的复杂对象,主要是对业务数据的封装,可能包含一个或多个其它对象。
BO包含业务逻辑,如调用DAO、RPC等等,负责把PO转换为VO或DTO。
BO和Service不同的是,它只包含基本的业务操作;而Service负责整个流程,一个业务流程可能会调用到多个BO。

比如一个简历,有教育经历、工作经历、社会关系等等。 我们可以把教育经历对应一个 PO ,工作经历对应一个 PO ,社会关系对应一个 PO 。 建立一个完整简历的 BO 对象处理简历,每个 BO 包含上面的这些 PO 。 这样处理业务逻辑时,我们就可以使用 BO 去处理。

VO 视图对象


VO用来保存Web、SWT、swing、android、iOS等一个界面对应的数据,以便显示。
与DTO一样,使用VO返回给前端,而不是PO。可以减少数据数据传输,保护表结构和解偶。

VO和DTO比较类似,主要的区别是在设计思想方面。数据是为了在微服务之间传输时,我们使用DTO;为了返回给web、iOS或者android进行展示时,我们使用VO。

对象转换


我们经常会有把PO转为VO、DTO,或者是反过来的需求。
使用BeanUtils.copyProperties()方法,可以方便地在PO、DTO和VO之间转换。

小结


我们把java bean分成了PO、DTO、VO等,主要是有下面好处:

方便管理。
解偶。
 

 

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

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

相关文章

linux C++ vscode连接mysql

1.linux使用Ubuntu 2.Ubuntu安装vscode 2.1 安装的是snap版本,直接打开命令行执行 sudo snap install --classic code 3.vscode配置C 3.1 直接在扩展中搜索C安装即可 我安装了C, Chinese, code runner, 安装都是同理 4.安装mysql sudo apt update sudo apt install mysql-…

【算法】双向冒泡排序

// // Created by Lunau on 2023/10/11. // #include<stdio.h> #include <cstdlib>void swap(int &i,int &j) {int tp i;i j;j tp; }/*** 双向冒泡排序&#xff0c;采用双指针* param arr* param len*/ void Sort(int arr[], int len) {int p0, q len-…

干货!SRC漏洞挖掘项目实战经验分享

目录 一、hunter上搜索web.title”nacos”&#xff0c;查找中国境内的资产&#xff0c;定位到两个地址。 二、访问一下8086端口&#xff0c;界面很明显是nacos&#xff0c;直接抓包&#xff0c;创建用户。 三、登录网站&#xff0c;里面看到配置管理。 四、查看下redis.yml…

驾驶数字未来:汽车业界数字孪生技术的崭新前景

随着数字化时代的到来&#xff0c;汽车行业正经历着前所未有的变革。数字孪生技术&#xff0c;作为一种前沿的数字化工具&#xff0c;正在为汽车行业带来革命性的影响&#xff0c;不仅改变着汽车制造和维护的方式&#xff0c;也为消费者带来了前所未有的体验。让我们一起探讨&a…

许战海战略文库|无增长则衰亡:中小型制造企业增长困境

竞争环境不是匀速变化&#xff0c;而是加速变化。企业的衰退与进化、兴衰更迭在不断发生&#xff0c;这成为一种不可避免的现实。事实上&#xff0c;在产业链竞争中增长困境不分企业大小&#xff0c;而是一种普遍存在的问题&#xff0c;许多收入在1亿至10亿美元间的制造企业也同…

【WSN】模拟无线传感器网络研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【python海洋专题十七】读取几十年的OHC数据,画四季图

本期内容 读取多年数据&#xff0c;画四季图 Part01. 多年数据处理 图片 多年年平均的OHC分布 图片 春夏秋冬&#xff1a; ohc_all_new np.reshape(ohc_new, (12, 80, 29, 27), order‘C’) ohc_all_season_mean np.mean(ohc_all_new, axis1) ohc_season np.reshape(o…

移动网络 为何ping 不通自己的公网 IP?

移动网络 ping 不通自己的公网 ip&#xff0c;显示请求超时怎么办&#xff1f; 题主所谓的公网IP&#xff0c;并没有配置在任何主机的TCP/IP协议栈上&#xff0c;所以Ping不通。在浩瀚的互联网上去寻找答案&#xff0c;包括ChatGPT机器人&#xff0c;答案就是“禁Ping了“。可…

js数组按照id删除

1.使用filter()方法实现JavaScript数组id删除 &#xff08;该方法写在methods里面&#xff09; DelSkill(row){ console.log(row,"ww"); this.personSkillTableData this.personSkillTableData.filter(item > item.skillId ! row.skillId) }, 在上述代码中&am…

2023年天猫双11:草柴APP如何找到2023天猫双十一优惠券怎么领取使用?

2023年天猫双11活动整体分为三波&#xff0c;第一波为现货售卖&#xff0c;第二波为双11红包雨&#xff0c;第三波为尾款支付。2023天猫双十一可参加活预售、满减、红包、优惠券。具体如何使用草柴APP找到2023天猫双11要购买商品的优惠券&#xff0c;请查看详细教程。 草柴APP如…

十六、代码校验(1)

本章概要 测试 单元测试JUnit测试覆盖率的幻觉 你永远不能保证你的代码是正确的&#xff0c;你只能证明它是错的。 让我们先暂停编程语言特性的学习&#xff0c;看看一些代码基础知识。特别是能让你的代码更加健壮的知识。 测试 如果没有测试过&#xff0c;它就是不能工作的…

EPLAN_003#常用功能(三)

一、图形编辑 按空格键结束 二、对象捕捉、设计模式 设计模式类似于CAD中 基于基准点 复制等功能 三、比例缩放、拉伸、修剪、修改长度、圆角、倒角 四、标注 五、窗口宏、符号宏&#xff08;在编辑菜单中&#xff0c;或者右键&#xff09; 快捷键&#xff1a;CTRLF5 打开的时候…

Matlab之数组、包含分配给类别的值函数categorical

一、功能 categorical 是为一组有限的离散类别&#xff08;例如 High、Med 和 Low&#xff09;赋值的数据类型。这些类别可以采用您指定的数学排序&#xff0c;例如 High > Med > Low&#xff0c;但这并非必须。分类数组可用来有效地存储并方便地处理非数值数据&#xf…

2023-10-11 LeetCode每日一题()

2023-10-11每日一题 一、题目编号 2512. 奖励最顶尖的 K 名学生二、题目链接 点击跳转到题目位置 三、题目描述 给你两个字符串数组 positive_feedback 和 negative_feedback &#xff0c;分别包含表示正面的和负面的词汇。不会 有单词同时是正面的和负面的。 一开始&…

ROS学习笔记(六)---服务通信机制

1. 服务通信是什么 在ROS中&#xff0c;服务通信机制是一种点对点的通信方式&#xff0c;用于节点之间的请求和响应。它允许一个节点&#xff08;服务请求方&#xff09;向另一个节点&#xff08;服务提供方&#xff09;发送请求&#xff0c;并等待响应。 服务通信机制在ROS中…

极坐标和直角坐标的积分转换

如下图所示&#xff0c;当 θ 不变&#xff0c; ρ 增大为 ρ Δ ρ ( 即 ρ 1 ) 时 \theta不变&#xff0c;\rho增大为\rho \Delta \rho(即\rho_1)时 θ不变&#xff0c;ρ增大为ρΔρ(即ρ1​)时, 面积的增量为&#xff1a; 1 2 θ ( ρ Δ ρ ) 2 − 1 2 θ ρ 2 θ ρ…

第二章 进程与线程 十九、死锁的概念

目录 一、定义 二、死锁、饥饿和死循环的区别 三、死锁的必要条件 四、死锁的处理策略 五、总结 一、定义 死锁是指两个或多个进程等待对方释放自己所持有的资源&#xff0c;导致所有进程都被阻塞&#xff0c;无法继续执行。这种情况可能会导致系统瘫痪&#xff0c;需要通…

(二)实现Bean属性依赖注入功能【手撸Spring】

一、前言 在上一篇手撸Spring之实现一个简易版IoC容器&#xff0c;我们先把最简单的IoC架子搭了起来&#xff0c;即实现了一个Bean的注入&#xff0c;体会了依赖反转的过程。这里提到的依赖反转&#xff0c;大家肯定非常耳熟了&#xff0c;也就是将业务对Bean的依赖反转了&…

【网络】网络编程——带你手搓简易TCP服务端(echo服务器)+客户端(四种版本)

这里写自定义目录标题 前言正式开始用生活中的例子来讲解TCP服务端和客户端代码讲解服务端基本框架创建套接字 bindlisten监听accept接收连接通信单线程版多进程①版多进程②版多线程版线程池版 客户端 收尾 前言 本篇主要讲解套接字编程&#xff0c;以TCP服务端和客户端为主…

MySQL为什么用b+树

索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量&#xff0c;数据量大了索引才显得有意义&#xff0c;如果我想要在[1,2,3,4]中找到4这个数据&#xff0c;直接对全数据检索也很快&am…