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…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
