后端去拿數據怎么拿?

簡單來說,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
英文地址,請注明出處:http://en.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 …