首页 > 其他分享 >DTO、VO、PO、DO、BO

DTO、VO、PO、DO、BO

时间:2023-08-19 21:33:49浏览次数:32  
标签:flavors DO DTO 对象 BO PO 属性

总图:

 

1、DTO介绍

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

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

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

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

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

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

这里可能会遇到个问题,现在微服务盛行,服务和服务之间调用的传输对象能叫DTO吗?
我的理解是看情况
DTO本身的一个隐含的意义是要能够完整的表达一个业务模块的输出
如果服务和服务之间相对独立,那就可以叫DTO
如果服务和服务之间不独立,每个都不是一个完整的业务模块,拆开可能仅仅是因为计算复杂度或者性能的问题,那这就不能够叫做DTO,只能是BO

DTO(Data Transfer Object)数据传输对象,主要用于远程调用等需要大量传输对象的地方,比如我们有一个交易订单表,含有 25 个字段,那么其对应的 PO 就有 25 个属性,但我们的页面上只需要显示 5 个字段,因此没有必要把整个 PO 对象传递给客户端,这时我们只需把仅有 5 个属性的 DTO 把结果传递给客户端即可。
还有一种就是前段传过来的数据中没有实体类能接受,比如出传递回来10个参数,其中9个参数是可以让一个现有的实体类来接受的,但是另外一个参数是没有的,所以创建一个DTO类来进行对数据的接收。使用 DTO 的好处有两个:

一是能避免传递过多的无用数据,提高数据的传输速度;

二是能隐藏后端的表结构。

常见的用法是:将请求的数据或属性组装成一个 RequestDTO,再将响应的数据或属性组装成一个 ResponseDTO.

2、DTO使用

(1)页面传给后端的数据

其中里面的参数除了dish菜品表的属性之外,还有一个flavors属性,但是dish中没有

所以我们创建DTO类。

 

(2)DTO类

 

其中List属性用来接收前端传来flavors属性(因为前端传来的flavors数据中可能会有多个,所以用一个List集合来接收)

DishFlavor类中有对应name和value属性字段来接收flavors属性。注意DishDto继承Dish

所以有Dish的属性

 

注意:上面Dto继承了Dish类,所以可以接收前端传来Dish相关的属性!!!!

 

service中的方法:

 

上面代码中,首先先将dishDto中有关菜品的基本信息保存到菜品表中。然后得到dishId,然后通过stream流(也可以使用foreach循环)遍历item,这里的item对象是dishflavors类的,不仅要存储前端传来的flavors属性数值,我们将dishId数值传到item对象的属性,菜品口味表中不能只有口味相关信息,还要包含菜品的ID。

最后将对象转成list集合,然后赋值给flavors集合类。然后作为参数保存到菜品表中。

//注意上面只有Flavors的数据,没有dishId数据,而dish_flavors数据库表中有,所以我们需要将该dishId数据
//赋值给该集合的每一个元素(对象)的dishId属性,然后在转化为集合保存到flavors表中

3、VO

VO(Value Object)值对象
VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,这就叫VO
VO主要的存在形式就是js里面的对象(也可以简单理解成json)

 

4、PO

PO(Persistant Object)持久对象
PO比较好理解
简单说PO就是数据库中的记录,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO对象
通常PO里面除了get,set之外没有别的方法
对于PO来说,数量是相对固定的,一定不会超过数据库表的数量

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


5、BO

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,到这里这些关系基本就理清楚了

6、总结

dto(请求参数可能会与vo不同,sql传参使用), po(持久层查询结果,返回使用po接收), vo(页面展示,po转换成vo反给前端), 对非微服务系统来说,业务层service相当于bo了

标签:flavors,DO,DTO,对象,BO,PO,属性
From: https://www.cnblogs.com/xdqx/p/17643143.html

相关文章

  • 社区版idea插件spring assistant开发springboot项目返回jsp
    最近了解到社区版idea没有专门的sringboot,网上网友提供支持说是springboot社区版有几种开发模式:springinitilizer:https://start.spring.io/在线创建springassistant插件支持(具体版本可以去github找)这次我选择第二种,然而在springboot开发返回jsp页面一直报错前端页面报错:后端控......
  • DTO、对象拷贝——多表查、修改、添加
    问题介绍一:一个分页查询方法,前端页面需要展示菜品信息(dish表),和菜品类型id信息(categoryId),但是菜品类型类中的菜品分类属性字段,菜品表中没有,所以使用DTO类,将两类信息保存到一个DTO类中。1、DishDto类其中该类继承Dish,所以有Dish类中的所有字段属性,本身自带categoryName属性与List......
  • 解决虚拟上docker 启动ES访问不成功
    可能原因是ES太耗内存了,我发现启动了ES容器后,像dockerps这种命令都很慢而且查看日志发现进行垃圾回收出现错误。所以判断可能是因为ES太耗内存。采用以下命令启动容器,应该可以解决。dockerrun-id--nameelasticsearch-d--restart=always-p9200:9200-p9300:9300-v/usr......
  • 5.2 复式记账法总体流程 Double Entry Accounting
    1.日记账GeneralJournal账簿格式日期、分类账户、增加金额(借方)、减少金额(贷方)日记账像一个银行流水单,它按时间顺序清晰的记录了一个企业在某个时间段所发生的所有商业交易。如下图:2.把日记账内容记录到分类账户LedgerAcount分类账簿格式:分类账户名称、日期(增)、账户(......
  • MacbookPro 17年款老机器升级Macos10.15.7挺好的
    MacbookPro17年款老机器升级Macos10.15.7挺好的由于需要安装一些软件,至少需要10.14或者10.15,所以,把MacBookPro17年款的老机器进行了升级,原装的系统是10.12.6.安装之前在网上搜索了各种升级的利弊,有升级成功的,也有很多说升级之后不能使用,然后又降级的。搞得犹豫了好一会,最后还......
  • iBooker 技术评论 20230819:打工是风险最高的事情
    很多人总是认为打工是稳定的事情,因为每个月都有工资到账。但是这个稳定从来不取决于你,是公司所决定的。换句话说,公司想什么时候开除你就什么时候开除你。这么看来,打工毫无稳定可言。根据墨菲定律,如果公司能够迫害你,或者说迫害你的收益大于不这么做,就一定会迫害你。那为什么多数人......
  • Windows Terminal配置Git Bash
    大部分程序员对LinuxBash的熟悉程度肯定高于Windows的PowerShell,而Git是程序员电脑上必装的软件之一(没装?Areyoukiddingme?),GitBash可以在Windows上给我们提供LinuxBash的能力。可是GitBash这个古老质朴黑乎乎的界面,虽然说也不是不能用,但确实也只是凑活吧。。。因此今天我......
  • 【补充】为什么Windows不支持epoll
    【补充】为什么Windows不支持epoll【一】为什么Windows不支持epoll:epoll是Linux系统提供的一种IO多路复用机制,而Windows系统并没有提供与之等价的底层机制。Windows使用一种名为I/O完成端口(I/OCompletionPort)的技术来实现高效的异步IO处理。虽然epoll和......
  • ubuntu与windows双系统时间同步
    windows认为,BIOS时间就是当地时间。所以windows会直接显示BIOS时间。ubuntu认为,BIOS时间应当是UTC时间(格林尼治标准时间)。所以ubuntu会将BIOS时间加8小时后再显示出来(中国,UTC+8)。解决方案是,在ubuntu终端中输入:sudotimedatectlset-local-rtc1这句话的作用是让ubuntu将系统......
  • Docker搭建lnmp之network篇
    dockerpullnginx#拉去最新的nginx镜像一、搭建vagrant+VagrantBoxVM环境创建Vagrantfile文件vagrantinit编辑Vagrantfile文件Vagrant.configure("2")do|config|config.vm.box="centos7"#指定BOXconfig.vm.networ......