当前位置: 首页 > news >正文

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的差异性,这样子可以减少一部分数据对象的冗余,当会对代码数据出现一系列的冗余或复杂性,代码的逻辑不会那么的清晰。

  1. 松耦合:通过将DTO和DO之间的转换从业务逻辑中分离出来,可以将应用程序的不同层解耦,使其更加模块化和可维护。
  2. 数据格式转换:DTO和DO可以表示相同的数据实体,但是它们的数据结构可能会有所不同,通过DTO和DO之间的转换,可以将数据从一种格式转换为另一种格式,以满足不同层之间的数据传输和交互需求。
  3. 逻辑分离:DTO通常只用于数据传输,而DO用于业务逻辑处理,通过将DTO和DO之间的转换分离出来,可以使业务逻辑更加清晰明确,降低代码的复杂度和维护成本。
  4. 性能优化:DTO通常比DO轻量级,通过将DO转换为DTO,可以减少数据传输的开销和响应时间,从而提高应用程序的性能。
  5. 版本兼容:通过DTO和DO之间的转换,可以使应用程序的不同版本之间进行兼容,即使数据结构发生变化,也可以通过DTO和DO之间的转换来保证数据的正确传输和使用。

总之,DTO和DO之间的转换可以使应用程序更加灵活、可维护、性能更高、更加适应不同的业务需求,是一种有效的编程实践。


有些人又说针对DTO和DO不采用共用一套字段对象,让两模型存在差异,让数据对象跟有其对应的业务意义,针对代码会跟具有清晰可读性,减少程序冗余。

  1. 开销:DTO和DO之间的转换需要额外的开销,包括时间、内存等方面。如果转换次数过多或数据量过大,可能会导致性能问题。
  2. 代码冗余:如果使用手动编写转换代码的方式,可能会出现大量的重复代码,降低代码的可维护性和可读性。
  3. 映射错误:DTO和DO之间的转换可能会出现映射错误的问题,即转换后的数据可能不完全一致或有误。这需要开发人员进行仔细的测试和调试,以确保转换的正确性和可靠性。
  4. 过多的层:如果应用程序的层次结构过多,每个层之间都需要进行DTO和DO之间的转换,会导致代码复杂度增加,不利于系统的可维护性。

三、如何处理转换问题

一般DTO和DO模型互转可在controller层service层有些会在component层进行处理转换或者DAO层的入参进行转换处理

  1. 使用工具类库:可以使用第三方的工具类库,如MapStruct、ModelMapper等,自动生成转换代码。这种方式可以减少手动编写代码的工作量,提高效率,但是需要学习和使用相应的工具类库。
  2. 使用BeanUtils等工具类:进行简单的一对一的字段映射和克隆。
  3. 手动转换:手动编写转换代码将DTO转换为DO或将DO转换为DTO。这种方式可以根据具体的业务逻辑和需求进行定制化开发,但是需要编写大量的重复代码,耗时耗力。
  4. 使用注解:可以使用注解在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…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...