当前位置: 首页 > 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…...

Z-Image-Turbo-rinaiqiao-huiyewunv开发者教程:gc.collect()+empty_cache显存防泄漏实践

Z-Image-Turbo-rinaiqiao-huiyewunv开发者教程&#xff1a;gc.collect()empty_cache显存防泄漏实践 1. 项目概述 Z-Image Turbo (辉夜大小姐-日奈娇)是基于Tongyi-MAI Z-Image底座模型开发的专属二次元人物绘图工具。该工具通过注入辉夜大小姐(日奈娇)微调safetensors权重&am…...

终极视频修复指南:如何使用untrunc拯救损坏的MP4文件

终极视频修复指南&#xff1a;如何使用untrunc拯救损坏的MP4文件 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经遇到过珍贵的视频文件突然无法播放&…...

前后端框架模式对比(golang)

前后端架构模式对比&#xff1a;分离与不分离 现代Web开发中&#xff0c;前后端架构的选择直接影响开发效率、维护成本和系统性能。结合Golang的实现&#xff0c;可以更清晰地分析前后端分离&#xff08;如REST API 前端框架&#xff09;与不分离&#xff08;如服务端渲染&…...

FPGA开发实战——常见错误排查与优化技巧(持续更新)

1. Vivado仿真与PR Flow冲突问题实战解析 第一次用Vivado做PR&#xff08;Partial Reconfiguration&#xff09;项目时&#xff0c;我兴冲冲地点开仿真按钮&#xff0c;结果弹出一个让人崩溃的报错&#xff1a;"ERROR [Common 17-69] Command failed. Simulation for PR F…...

Mac Mouse Fix:如何让第三方鼠标在macOS上释放全部潜能

Mac Mouse Fix&#xff1a;如何让第三方鼠标在macOS上释放全部潜能 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款开源工具&#xff0…...

避坑指南:在CodeSys里用three.js加载3D模型,我踩过的那些安全策略和路径坑

CodeSys集成three.js的实战避坑手册&#xff1a;从安全策略到模型加载的完整解决方案 在工业自动化领域&#xff0c;可视化界面正经历着从传统2D向3D交互的转型。当我在最近一个机械臂控制项目中尝试将three.js集成到CodeSys WebVisu环境时&#xff0c;原以为简单的任务却遭遇…...

3大突破:开源工具VideoCaptioner如何让零门槛实现AI实时字幕效率提升300%

3大突破&#xff1a;开源工具VideoCaptioner如何让零门槛实现AI实时字幕效率提升300% 【免费下载链接】VideoCaptioner &#x1f3ac; 卡卡字幕助手 | VideoCaptioner - 基于 LLM 的智能字幕助手&#xff0c;无需GPU一键高质量字幕视频合成&#xff01;视频字幕生成、断句、校正…...

出差党/远程办公必备:用OpenWrt软路由打造你的随身‘家庭办公室’(支持Windows远程唤醒与桌面)

移动办公革命&#xff1a;OpenWrt软路由构建高效远程办公系统 1. 现代远程办公的痛点与解决方案 作为一名常年奔波于各大城市的咨询顾问&#xff0c;我深刻理解移动办公的痛点&#xff1a;酒店网络不稳定、公共WiFi安全隐患、重要文件无法随时调取、高性能工作站闲置在家...直到…...

细胞转染优化方向(二):PEI体系关键参数进阶优化指南【曼博生物】

摘要&#xff1a;在PEI转染体系中&#xff0c;除基础培养条件外&#xff0c;质粒比例、DNA与PEI比率、孵育条件及病毒收获时间等参数同样显著影响转染效率与病毒产量。本文结合实验数据&#xff0c;对关键参数进行系统分析&#xff0c;为AAV及慢病毒生产提供优化思路。 关键词…...

从河南农村到泰国拳台:张家乐在Bangla Boxing Stadium加冕泰拳冠军的荣耀

2017年&#xff0c;泰国普吉岛Bangla Boxing Stadium的聚光灯下&#xff0c;来自中国河南的拳手张家乐高举冠军奖杯&#xff0c;在这片泰拳发源地的擂台上&#xff0c;书写了中国格斗选手的荣耀篇章。这场胜利&#xff0c;不仅是他个人职业生涯的高光时刻&#xff0c;更让世界看…...