Day911.DTO和DO为什么要互转 -SpringBoot与K8s云原生微服务实践
DTO和DO为什么要互转
Hi,我是阿昌
,今天学习记录的是关于DTO和DO为什么要互转
的内容。
一、什么是DTO
DTO ,数据传输对象,全称 (Data transfer object),用于网络之间传输通讯的对象模型,一般针对API接口输入输出的地方,或一些业务转换的时候会使用该对象。
DAO,数据模型对象,全称(Data Access Object),用于做ORM映射数据库表的对象,一般会用于持久化。
DMO ,数据模型对象,全称(Data Model Object),也称实体对象或领域对象,封装数据存储字段,主要用于持久化领域数据。
DTO和DO虽然称位不同,但是在多大情况下,他们所承载的数据字段是一样的。但针对某些场景下DO可能会缺少一些字段,或针对DTO的字段校验方式也是不同的。
二、冲突点
DTO和DO是两种不同的数据对象,通常用于在应用程序不同的层之间进行数据传输和交互。
DTO和DO之间的转换通常是必要的,因为它们通常在不同的层之间传输和使用,而这些层可能具有不同的需求和格式。例如,在应用程序的前端界面中,通常需要的是轻量级的DTO,以减少数据传输的开销和响应时间。而在应用程序的后端业务逻辑层中,通常需要使用DO对象进行业务处理和数据库交互。因此,将DTO转换为DO或将DO转换为DTO是必要的,以确保数据在不同层之间正确地传输和使用,并保持一致性和可靠性。
有些人说针对DTO和DO采用共用一套字段对象,采用程序来处理屏蔽DTO和DO的差异性,这样子可以减少一部分数据对象的冗余,当会对代码数据出现一系列的冗余或复杂性,代码的逻辑不会那么的清晰。
松耦合
:通过将DTO和DO之间的转换从业务逻辑中分离出来,可以将应用程序的不同层解耦,使其更加模块化和可维护。数据格式转换
:DTO和DO可以表示相同的数据实体,但是它们的数据结构可能会有所不同,通过DTO和DO之间的转换,可以将数据从一种格式转换为另一种格式,以满足不同层之间的数据传输和交互需求。逻辑分离
:DTO通常只用于数据传输,而DO用于业务逻辑处理,通过将DTO和DO之间的转换分离出来,可以使业务逻辑更加清晰明确,降低代码的复杂度和维护成本。性能优化
:DTO通常比DO轻量级,通过将DO转换为DTO,可以减少数据传输的开销和响应时间,从而提高应用程序的性能。版本兼容
:通过DTO和DO之间的转换,可以使应用程序的不同版本之间进行兼容,即使数据结构发生变化,也可以通过DTO和DO之间的转换来保证数据的正确传输和使用。
总之,DTO和DO之间的转换可以使应用程序更加灵活、可维护、性能更高、更加适应不同的业务需求,是一种有效的编程实践。
有些人又说针对DTO和DO不采用共用一套字段对象,让两模型存在差异,让数据对象跟有其对应的业务意义,针对代码会跟具有清晰可读性,减少程序冗余。
开销
:DTO和DO之间的转换需要额外的开销,包括时间、内存等方面。如果转换次数过多或数据量过大,可能会导致性能问题。代码冗余
:如果使用手动编写转换代码的方式,可能会出现大量的重复代码,降低代码的可维护性和可读性。映射错误
:DTO和DO之间的转换可能会出现映射错误的问题,即转换后的数据可能不完全一致或有误。这需要开发人员进行仔细的测试和调试,以确保转换的正确性和可靠性。过多的层
:如果应用程序的层次结构过多,每个层之间都需要进行DTO和DO之间的转换,会导致代码复杂度增加,不利于系统的可维护性。
三、如何处理转换问题
一般DTO和DO模型互转可在controller层
或service层
有些会在component层进行处理转换或者DAO层的入参进行转换处理
使用工具类库
:可以使用第三方的工具类库,如MapStruct、ModelMapper等,自动生成转换代码。这种方式可以减少手动编写代码的工作量,提高效率,但是需要学习和使用相应的工具类库。使用BeanUtils等工具类
:进行简单的一对一的字段映射和克隆。手动转换
:手动编写转换代码将DTO转换为DO或将DO转换为DTO。这种方式可以根据具体的业务逻辑和需求进行定制化开发,但是需要编写大量的重复代码,耗时耗力。使用注解
:可以使用注解在DTO和DO之间进行转换。比如使用@Mapping注解进行字段映射,@Mapper注解标记转换接口等。这种方式相对于手动转换和使用工具类库来说,可以更加简洁和方便,但是需要对注解的使用和原理有一定的了解。
四、总结
DTO
(Data Transfer Object)和DO
(Domain Object)是两个重要的概念,在大型应用程序开发中扮演着重要的角色。
DTO通常用于数据传输,是一个轻量级的对象,其目的是为了简化数据传输、降低数据传输量、以及将数据从一种格式转换为另一种格式。DTO通常只包含需要传输的数据字段,而不包含任何业务逻辑。
DO则是应用程序中的业务实体对象,它通常包含业务逻辑和数据状态等信息。DO通常用于业务逻辑的处理和数据持久化操作。
DTO和DO之间的转换是将数据从DTO对象转换为DO对象或从DO对象转换为DTO对象的过程。通过将DTO和DO之间的转换从业务逻辑中分离出来,可以使应用程序更加模块化、可维护和灵活,同时可以提高应用程序的性能。
DTO和DO之间的转换也存在一些缺点,包括额外的开销、代码冗余、映射错误等。在具体情况下需要根据业务需求和开发团队的技术水平进行综合考虑,选择合适的方式进行DTO和DO之间的转换。
相关文章:
Day911.DTO和DO为什么要互转 -SpringBoot与K8s云原生微服务实践
DTO和DO为什么要互转 Hi,我是阿昌,今天学习记录的是关于DTO和DO为什么要互转的内容。 一、什么是DTO DTO ,数据传输对象,全称 (Data transfer object),用于网络之间传输通讯的对象模型&#x…...

查找、排序、二叉树的算法,统统记录于此。
文章目录一、查找1. 无序表的顺序查找2. 折半查找3. 分块查找4. 二叉排序树BST5. 哈希表查找二、排序1. 不带哨兵的直接插入排序2. 带哨兵的直接插入排序3. 带哨兵、折半查找的直接插入排序4. 希尔排序5. 冒泡排序6. 快速排序7. 选择排序8. 堆排序9. 归并排序二叉树1. 递归先序…...
如何用Python实现在网页中嵌入YouTube的视频?
要在网页中嵌入YouTube视频,可以使用HTML代码,在Python中使用字符串拼接的方式生成HTML代码。下面是一个示例代码,可以生成嵌入YouTube视频的HTML代码: def embed_youtube_video(video_id, width560, height315): """ 生成嵌…...

Easy Deep Learning——PyTorch中的自动微分
目录 什么是深度学习?它的实现原理是怎么样的呢? 什么是梯度下降?梯度下降是怎么计算出最优解的? 什么是导数?求导对于深度学习来说有何意义? PyTorch 自动微分(自动求导) 为什么…...
【生物信息】利用ChatGPT解释GO分析中的关于Biological Processes的问题
利用ChatGPT解释GO分析中的一些问题 如何理解GO中的evidence:ISS,这是什么?qualifier:involved_in是什么意思?evidence:TAS是什么?evidence: IBA是什么?evidence: IMP是什么?evidence:IDA是什么?evidence: IEA是什么?GO分析中,evidence: NAS是什么意思?GO分析中…...

2018年MathorCup数学建模C题陆基导弹打击航母的数学建模与算法设计解题全过程文档及程序
2018年第八届MathorCup高校数学建模挑战赛 C题 陆基导弹打击航母的数学建模与算法设计 原题再现: 火箭军是保卫海疆主权的战略力量,导弹是国之利器。保家卫国,匹夫有责。为此,请参赛者认真阅读"陆基反舰导弹打击航母的建模示意图"。(附图 1 )参考图中的…...

打怪升级之CFile类
CFile类 信息源自官方文档:https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfile-class?viewmsvc-170。 CFile是Microsoft 基础类文件类的基类。它直接提供非缓冲的二进制磁盘输入/输出设备,并直接地通过派生类支持文本文件和内存文件。CFile与…...

[css]通过网站实例学习以最简单的方式构造三元素布局
文章目录二元素布局纵向布局横向布局三元素布局b站直播布局实例左右-下 布局左-上下 布局上下-右 布局方案一方案二后言二元素布局 在学习三元素布局之前,让我们先简单了解一下只有两个元素的布局吧 两个元素的相对关系非常简单,不是上下就是左右 纵向布…...

【冲刺蓝桥杯的最后30天】day6
大家好😃,我是想要慢慢变得优秀的向阳🌞同学👨💻,断更了整整一年,又开始恢复CSDN更新,从今天开始更新备战蓝桥30天系列,一共30天,如果对你有帮助或者正在备…...

ssm框架之spring:浅聊IOC
IOC 前面体验了spring,不过其运用了IOC,至于IOC( Inverse Of Controll—控制反转 ) 看一下百度百科解释: 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则&#x…...

pytest初识
一、单元测试框架 (1)什么是单元测试框架? 单元测试是指在软件开发中,针对软件的最小单元(函数、方法)进行正确性的检查测试 (2)单元测试框架 java:junit和testng pytho…...
设计模式~责任链模式(Chain of Responsibility)-12
目录 (1)优点 (2)缺点 (3)使用场景 (4)注意事项: (5)应用实例: (6)经典案例 代码 责任链, …...

【ElasticSearch】(一)—— 初识ES
文章目录1. 了解ES1.1 elasticsearch的作用1.2 ELK技术栈1.3 elasticsearch和lucene1.4 为什么不是其他搜索技术?1.5 总结2. 倒排索引2.1 正向索引2.2 倒排索引2.3 正向和倒排3. ES的一些概念3.1 文档和字段3.2 索引和映射3.3 mysql与elasticsearch1. 了解ES Elasti…...

MySQL 事务隔离
MySQL 事务隔离事务隔离实现事务的启动ACID : 原子(Atomicity)、一致(Consistency)、隔离(Isolation)、永久(Durability) 多个事务可能出现问题 : 脏读 (dirty read) , 不可重复读 (non-repeatable read) , 幻读 (phantom read) 事务隔离级别 : 读未提交 (read uncommitted)…...
基础06-JS中for-in和for-of有什么区别
for…in 和 for…of 的区别 题目 for…in 和 for…of 的区别 key 和 value for…in 遍历 key , for…of 遍历 value const arr [10, 20, 30] for (let n of arr) {console.log(n) }const str abc for (let s of str) {console.log(s) }function fn() {for (let argument…...

AI视频智能分析EasyCVR视频融合平台录像计划模块搜索框细节优化
EasyCVR支持海量视频汇聚管理,可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、智能分析等视频服务。在录像功能上,平台可支持: 根据业务场景自定义录像计划,可支持7*24H不间断录像,支持…...

TCP和UDP对比
TCP和UDP对比 UDP(用户数据报协议) 无连接(指的是逻辑连接关系,不是物理上的连接) 支持单播、多播以及广播,也就是UDP支持一对一、一对多、一对全 面向应用报文的,对应用层交付的报文直接打包 无连接不可靠的传输服务(适用于IP电话、视频会议等实时应用),不使用流量控制和…...

CVS Health 西维斯健康EDI需求
CVS Health西维斯健康在特拉华州成立,通过旗下的 CVS Pharmacy 和 Longs Drugs 零售店以及 CVS.com 电商提供处方药、美容产品、化妆品、电影和照片加工服务、季节性商品、贺卡和方便食品。CVS Health通过使高质量的护理变得更经济、更易获得、更简单、更无缝&#…...

Anaconda配置Python科学计算库SciPy的方法
本文介绍在Anaconda环境中,安装Python语言SciPy模块的方法。 SciPy是基于Python的科学计算库,用于解决科学、工程和技术计算中的各种问题。它建立在NumPy库的基础之上,提供了大量高效、易于使用的功能,包括统计分析、信号处理、优…...

数据库基本功之复杂查询的子查询
子查询返回的值可以被外部查询使用,这样的复合查询等效与执行两个连续的查询. 1. 单行单列子查询 (>,<,,<>,>,<)内部SELECT子句只返回一行结果 2.多行单列子查询 (all, any, in,not in) all (>大于最大的,<小于最小的) SQL> select ename, sal from…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...