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…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
