后端去拿数据怎么拿?

简单来说,Entity 和 DTO 代表了数据在不同层次和场景下的不同形态和目的。

它们最根本的区别在于:职责和目的不同


一句话概括

  • Entity:代表数据库中的表,是业务逻辑的核心,与持久化(数据库)紧密相关。

  • DTO:代表传输的数据,是API交互的契约,与客户端(前端、其他服务)紧密相关。


详细对比

  • DTO(Data Transfer Object): 数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载。(个人理解:原先需要获取用户信息和用户订单需要调用俩个接口,将返回数据整合为一个DTO,调用一次就可以获取所有数据)
  • Entity: 实体类,一般与持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应Entity的一个(或若干个)属性

为了更清晰地理解,我们从多个维度进行对比:

特性维度Entity (实体)DTO (数据传输对象)
核心职责模型化业务领域,承载核心业务逻辑和规则。传输数据,在不同进程或网络间安全、高效地搬运数据。
所属层级领域层 / 数据持久层。与数据库ORM(如Hibernate, MyBatis)直接交互。表现层 / 应用层。用于Controller的入参和出参。
与数据库关系强关联。其字段通常与数据库表结构一一对应,包含主键、外键、关联关系等。无关联。完全不知道数据库的存在,结构根据API需求定制。
设计重点准确性和完整性。要完整描述业务对象,并包含数据完整性约束(如@NotNull)。API契约和性能。要明确、稳定,并且只包含客户端需要的数据,避免不必要的字段传输以提升性能。
典型特征• 包含ORM注解(如@Entity@Table@Id
• 包含业务逻辑方法
• 可能有关联对象的集合(如List<Order>
• 通常是纯数据容器(只有getter/setter)
• 包含验证注解(如@Email,用于接口参数校验)
• 结构扁平化,可能组合多个Entity的数据
变化原因数据库结构或业务逻辑变化客户端界面或需求变化

举例说明

假设我们有一个博客系统,用户(User)和文章(Article)是一对多关系。

1. Entity (数据库模型)
@Entity
@Table(name = "user")
public class UserEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true)private String username;@Column(nullable = false)private String password; // 敏感信息,加密存储@Column(nullable = false, unique = true)private String email;@OneToMany(mappedBy = "author")private List<ArticleEntity> articles; // 关联对象// 业务逻辑方法public boolean isPasswordValid(String rawPassword) {// ... 密码验证逻辑return true;}// Getter和Setter省略...
}
  • 注意:这个类直接映射数据库,包含敏感字段password和整个ArticleEntity集合。绝对不应该直接返回给前端

2. DTO (API传输模型)

场景一:获取用户基本信息(用于用户列表)

public class UserSimpleDto {private Long id;private String username;// 没有 password, email, articles// Getter和Setter...
}

场景二:用户注册时提交的数据

public class UserCreationDto {@NotBlank(message = "用户名不能为空")@Size(min = 3, max = 16)private String username;@NotBlank(message = "密码不能为空")@Size(min = 6, max = 20)private String password;@Email(message = "邮箱格式不正确")private String email;// 没有 id// Getter和Setter...
}

场景三:获取用户详情(包含部分关联信息)

public class UserDetailDto {private Long id;private String username;private String email;// 不是返回完整的ArticleEntity,而是专门为API设计的ArticleDtoprivate List<ArticlePreviewDto> articles;// Getter和Setter...
}public class ArticlePreviewDto {private Long id;private String title;private LocalDateTime createdAt;// 没有文章内容等详细字段,因为是“预览”
}

为什么不能直接用Entity作为接口的输入输出?

  1. 安全问题Entity通常包含敏感信息(如passwordsalary等),直接返回会给系统带来巨大安全风险。

  2. 性能问题Entity的关联关系(如articles)可能导致ORM框架加载大量不需要的关联数据(N+1查询问题),造成性能瓶颈。而DTO可以精确控制返回的数据。

  3. API稳定性:数据库模型(Entity)的变化会直接导致API的变化,从而迫使所有客户端升级。而DTO在Entity和客户端之间提供了一个缓冲层,你可以修改Entity结构而不影响API契约,只需调整Entity到DTO的转换逻辑即可。

  4. 过度传输或传输不足Entity是为了完整描述业务对象,而前端可能只需要其中几个字段(过度传输),或者需要组合多个Entity的字段(传输不足)。DTO可以完美解决这两种情况。

  5. 验证分离:对API参数的验证(如@Email)应该放在DTO上,而不是Entity上。Entity的验证更关注数据完整性(如@NotNull)。

工作流程

一个标准的后端处理流程如下:

  1. 入参:客户端发送请求 -> Controller接收并解析JSON到DTO -> 进行参数校验 -> 将DTO转换为Entity -> 调用Service

  2. 处理Service使用Entity进行业务逻辑处理,并调用Repository保存到数据库。

  3. 出参Service获取处理后的Entity -> 转换为DTO -> Controller将DTO返回给客户端(转换为JSON)。

其中的转换过程通常使用工具类如 MapStructModelMapper 或手动编写的转换器来完成。

总结

EntityDTO
问自己它如何在数据库中存储?客户端需要看到什么?
目的建模业务,与数据库交互网络传输,定义API契约
关键不要将Entity直接暴露给外部。总是通过DTO来与客户端交互。

将Entity和DTO分离是构建健壮、可维护、安全且高性能的Web服务的重要最佳实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95228.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从源码角度来学习Activit的启动流程

免责声明&#xff1a;本文是本人的学习记录文档&#xff0c;有问题可以评论区指出&#xff0c;谢谢 一、从Launcher点击桌面图标&#xff0c;拉起app进程&#xff08;不同进程间拉组件&#xff09; 从桌面点击icon图标拉起进程&#xff0c;这个就涉及到很多逻辑了&#xff0c;我…

pgAdmin介绍(PostgreSQL数据库管理软件)数据库客户端、PG客户端、PostgreSQL客户端

文章目录**1. 安装 pgAdmin****1.1 下载****1.2 安装步骤&#xff08;以 Windows 为例&#xff09;**1. **运行安装程序**&#xff1a;双击下载的 .exe 文件。2. **接受协议**&#xff1a;点击 Next&#xff0c;勾选 I accept the agreement。3. **选择安装路径**&#xff1a;默…

桌面GIS软件FlatGeobuf转Shapefile代码分享

桌面GIS软件FlatGeobuf转Shapefile代码分享1、后端代码分享2、前端代码分享分享完成

【Bluedroid】A2DP Source 音频传输停止流程及资源管理机制(btif_a2dp_source_stop_audio_req)

本文深入剖析Android蓝牙协议栈中A2DP音频传输停止流程,涵盖从用户请求触发、工作线程调度、资源释放到性能统计的全链路实现。通过分析btif_a2dp_source_stop_audio_req到btif_a2dp_source_audio_tx_stop_event的代码执行路径,揭示多线程环境下的竞争规避策略、硬件抽象层(H…

1-ruby介绍、环境搭建、运行 hello world 程序

1-ruby介绍、环境搭建、运行 hello world 程序 Ruby 简介 Ruby 是一种开源的、面向对象的、解释型的动态编程语言&#xff0c;由 Yukihiro “Matz” Matsumoto 于 1995 年发布。主要特点包括&#xff1a; 纯面向对象&#xff1a;所有东西都是对象动态类型&#xff1a;变量不…

PPO、DPO和GRPO的区别

一、 核心思想一句话概括 首先&#xff0c;我们用三个比喻来快速理解它们的核心思想&#xff1a;PPO (近端策略优化)&#xff1a; 「比武招亲」 模型&#xff08;AI&#xff09;通过试错和与裁判&#xff08;奖励模型&#xff09;的互动来学习。它生成多个回答&#xff0c;裁判…

使用组合子构建抽象语法树

引言 组合子&#xff08;Combinator&#xff09;是一种函数式编程中的概念&#xff0c;它允许我们通过组合简单的函数来构建复杂的逻辑。在解析器和抽象语法树&#xff08;AST&#xff09;的构建中&#xff0c;组合子提供了一种简洁且模块化的方法。本文将介绍如何使用组合子来…

20.27《24GB显卡轻松训练ChatGLM3-6B!QLoRA极速微调实战指南》

24GB显卡轻松训练ChatGLM3-6B!QLoRA极速微调实战指南 import torch from transformers import AutoModel, AutoTokenizer, BitsAndBytesConfig# 配置4-bit量化参数 bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_use_double_quant=True

JSP 输出语法全面解析

JSP 输出语法全面解析 JSP 提供了多种输出内容到响应流的方式&#xff0c;每种方式都有其特定的使用场景和特点。以下是 JSP 输出语法的详细解析。 总结 JSP直接编写普通字符串 翻译到service方法的out.write(“这里面”) <%%> 翻译到service方法体内部&#xff0c;里面是…

前端学习——CSS

前面我们已经学习过来HTML。但是对于前端网页来说&#xff0c;HTML只是网页的骨架。而只是使用HTML的网页是十分简陋的&#xff0c;一般没办法应用于实际应用。因此我们还要学习CSS对网页进行美化。 相关代码已经上传至gitee&#xff1a;前端学习代码: 前端学习&#xff0c;喜欢…

【stm32】对射式红外传感器计次以及旋转编码器计次

对射式红外传感器计次 1. 将传感器的功能分装在一个模块里CountsSenser2.配置外部中断1.配置RCC&#xff0c;将涉及的外设的时钟都打开 2.配置GPIO&#xff0c;选择端口为输入模式 3.配置AFIO&#xff0c;选择前面使用的一路GPIO,连接到后面的EXTI 4.配置EXTI&#xff0c;选择边…

人工智能学习:Python相关面试题

1、Python与其他语言&#xff08;如Java/C&#xff09;的核心区别是什么&#xff1f;Python是动态类型的解释型语言&#xff0c;语法简洁&#xff0c;支持多种编程范式&#xff08;面向对象、函数式、过程式&#xff09;。与Java相比&#xff0c; Python无需编译且语法更简洁&a…

【Canvas与旗帜】哥伦比亚旗圆饼

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>哥伦比亚旗圆饼 Draft1</title><style type"text/css&qu…

Linux 系统 poll 与 epoll 机制2:实现原理与应用实践

接上文poll机制&#xff1a;Linux 系统 poll 与 epoll 机制1。 3. epoll 机制&#xff1a;高并发 I/O 的优化实现​ epoll(Efficient event polling implementation)机制诞生于 Linux 2.5.44 版本&#xff0c;是内核为解决高并发 I/O 场景&#xff08;如万级以上 FD 监听&…

Mamba LLM 架构简介:机器学习的新范式

Mamba LLM 架构简介&#xff1a;机器学习的新范式探索 Mamba LLM 的强大功能&#xff0c;Mamba LLM 是来自一流大学的变革性架构&#xff0c;重新定义了 AI 中的序列处理。语言模型是一种经过训练的机器学习模型&#xff0c;用于在自然语言上执行概率分布。它们的架构主要由多层…

GaussDB生产扩容引起的PANIC问题处理案例

1 环境信息CPU:8C内存&#xff1a;64GGaussDB版本&#xff1a;24.7.32解决方案部署形态&#xff1a;HCS部署形态&#xff1a;1主1从1日志扩容原因&#xff1a;当前的配置满足不了max_connections为2000值&#xff0c;即当前的业务最大连接数超过2000个而按照8C64G的配置最多满足…

【168页PPT】华为流程管理体系构建与落地(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/91662548 资料解读&#xff1a;【168页PPT】华为流程管理体系构建与落地 详细资料请看本解读文章的最后内容。华为&#xff0c;作为全球知名…

基于CotSegNet网络和机器学习的棉花点云器官分割和表型信息提取

一、引言PointNet作为点云处理领域的先驱与里程碑式深度学习模型&#xff0c;以其卓越的性能和对无序点云数据直接处理的能力而闻名。博主将分享1篇发表在《Computers and Electronics in Agriculture》&#xff08;中科院1区TOP&#xff09;的“Organ segmentation and phenot…

经典卷积神经网络CNN

一、CNN视觉处理三大任务&#xff1a;图像分类、目标检测、图像分割上游&#xff1a;提取特征&#xff0c;CNN下游&#xff1a;分类、目标、分割等&#xff0c;具体的业务1. 概述卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域, 往往我们输入的图像都很…

11.1.5 实现文件删除,共享和共享下载排行榜

1、图床分享图片api_sharepicture.cc sharepicture_cgi.c 分享后每个人都可以看到。 数据库&#xff1a; DROP TABLE IF EXISTS share_picture_list; CREATE TABLE share_picture_list (id int(11) NOT NULL AUTO_INCREMENT COMMENT 编号,user varchar(32) NOT NULL COMMENT …