springboot入門-DTO數據傳輸層

在 Spring Boot 應用中,DTO(Data Transfer Object,數據傳輸對象) 是專門用于在不同層(如 Controller 層、Service 層、外部系統)之間傳輸數據的對象。它的核心目的是解耦數據模型和業務邏輯,避免直接暴露數據庫實體(Entity)的結構,同時優化數據傳輸的效率和安全性。以下是 DTO 層的詳細說明及使用場景:


1. DTO 的作用

場景作用
屏蔽敏感數據過濾掉實體類中不應暴露的字段(如密碼、密鑰)。
減少網絡傳輸數據量僅返回前端需要的字段,避免傳輸冗余數據。
數據聚合與轉換將多個實體類的字段組合成一個對象,簡化接口響應。
版本兼容性允許接口參數和響應獨立變化,不影響數據庫表結構。
校驗與安全性在 DTO 層定義數據校驗規則(如 @NotBlank),防止非法數據進入業務邏輯。

2. DTO 與 Entity 的區別

特性DTOEntity(實體類)
用途數據傳輸(如接口請求/響應)映射數據庫表結構
字段設計僅包含必要字段包含所有表字段
數據校驗支持 javax.validation 注解通常不涉及校驗(由 DTO 處理)
生命周期僅在請求/響應過程中存在與數據庫操作綁定(如 JPA 管理)
嵌套對象可聚合多個實體類的數據通常對應單表或關聯表結構

3. DTO 層的實現步驟

(1) 定義 DTO 類

根據業務需求設計請求和響應 DTO:

// 請求 DTO(用于創建用戶)
public class UserCreateRequest {@NotBlankprivate String name;@Emailprivate String email;// Getter & Setter
}// 響應 DTO(用于返回用戶信息)
public class UserResponse {private Long id;private String name;private String email;// Getter & Setter
}
(2) 在 Controller 中使用 DTO

將 DTO 作為接口參數和返回值:

@RestController
@RequestMapping("/api/users")
public class UserController {private final UserService userService;// 創建用戶(接收 DTO,返回 DTO)@PostMappingpublic UserResponse createUser(@Valid @RequestBody UserCreateRequest request) {User user = userService.createUser(request);return convertToResponse(user);}// Entity 轉 DTOprivate UserResponse convertToResponse(User user) {UserResponse response = new UserResponse();response.setId(user.getId());response.setName(user.getName());response.setEmail(user.getEmail());return response;}
}
(3) Service 層處理 DTO

將 DTO 轉換為 Entity 后操作數據庫:

@Service
public class UserService {private final UserRepository userRepository;public User createUser(UserCreateRequest request) {User user = new User();user.setName(request.getName());user.setEmail(request.getEmail());return userRepository.save(user);}
}

4. DTO 的最佳實踐

(1) 使用工具簡化轉換

手動編寫轉換代碼繁瑣,推薦使用工具:

  • MapStruct(類型安全、高性能):
    @Mapper
    public interface UserMapper {UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);UserResponse toResponse(User user);
    }
    
  • ModelMapper(自動映射):
    ModelMapper modelMapper = new ModelMapper();
    UserResponse response = modelMapper.map(user, UserResponse.class);
    
(2) 分層 DTO 設計

根據場景定義不同的 DTO:

  • 請求 DTO(如 UserCreateRequest):用于接收接口參數。
  • 響應 DTO(如 UserResponse):用于返回接口數據。
  • 內部 DTO:用于服務間通信(如微服務調用)。
(3) 數據校驗

在 DTO 中使用 javax.validation 注解校驗數據:

public class UserCreateRequest {@NotBlank(message = "姓名不能為空")@Size(min = 2, max = 20)private String name;@Email(message = "郵箱格式錯誤")private String email;
}
(4) 避免循環依賴

當 DTO 包含嵌套對象時,需防止無限遞歸:

public class OrderResponse {private Long id;private UserResponse user;  // UserResponse 中不應反向引用 OrderResponse
}

5. 常見問題

(1) 為什么不用 Entity 直接作為接口參數/返回值?
  • 暴露敏感字段:如返回 User 實體的 password 字段。
  • 數據結構耦合:數據庫表結構變化會直接影響接口,破壞兼容性。
  • 性能問題:實體類可能包含大量無用字段,增加網絡開銷。
(2) DTO 和 VO(Value Object)的區別?
  • DTO:強調數據傳輸,可能包含業務邏輯無關的字段。
  • VO:強調業務含義,通常用于業務層內部傳遞數據(但實際開發中二者常混用)。
(3) 如何處理復雜嵌套結構?

使用工具(如 MapStruct)定義嵌套映射:

@Mapper
public interface OrderMapper {OrderResponse toResponse(Order order);default UserResponse toUserResponse(User user) {return UserMapper.INSTANCE.toResponse(user);}
}

6. 總結

設計要點說明
職責分離DTO 僅負責數據傳輸,不包含業務邏輯。
字段精簡僅暴露必要字段,避免冗余。
校驗前置在 DTO 層完成數據校驗,避免非法數據進入業務邏輯。
工具輔助使用 MapStruct 或 ModelMapper 簡化 Entity 和 DTO 的轉換。
版本管理獨立管理 DTO 的變更,確保接口兼容性。

通過合理使用 DTO 層,可以提升代碼的可維護性、接口的安全性和系統的擴展性,是 Spring Boot 開發中的關鍵實踐。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903009.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903009.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903009.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝docker,在docker上安裝mysql,docker上安裝nginx

目錄 一.安裝docker 1.1查看Linux版本的命令這里推薦兩種: 1.2查看內核版本有三種方式: 2.安裝 2.1 如果之前安裝了docker,先刪除舊版本的doker 2.2 安裝需要的軟件包,yum-util提供yum-config-manager功能,另外兩…

Android killPackageProcessesLSP 源碼分析

該方法用于終止指定包名/用戶ID/應用ID下符合條件的應用進程,涉及多進程管理、資源凍結、進程清理及優先級更新等操作。核心流程分為進程篩選、資源凍結、進程終止與資源恢復三個階段。 /*** 從已排序的進程列表中,提取從指定起始索引 startIdx 開始的連…

openAICEO山姆奧特曼未來預測雄文之三個觀察

《三個觀察》 山姆奧特曼 這篇文章主要講的是關于AGI(人工通用智能)的未來發展及其對社會的影響,用大白話總結如下: 核心觀點: AGI是什么? AGI是一種能像人類一樣解決各種復雜問題的智能系統,比…

部署yolo到k230教程

訓練:K230 借助 AICube部署AI 視覺模型 YOLO等教程_嘉楠 ai cube多標簽分類-CSDN博客K230模型訓練ai cube報錯生成部署文件異常_aicube部署模型顯示生成部署文件異常-CSDN博客 部署: # 導入必要的庫和模塊 import os import ujson # 超快的JS…

Flask 應用封裝成 Docker 服務的完整技術指南

一、實現原理 容器化核心邏輯 Docker 通過將應用代碼、運行環境和依賴項打包成鏡像,實現環境一致性。Flask 應用容器化需包含: Python 基礎運行環境項目代碼及依賴庫(requirements.txt)WSGI服務器(如 Gunicorn&#xf…

windows上的 Vmware Workstation 環境搭建

本文的視頻版本:https://www.bilibili.com/video/BV1JhLRzyESh Vmware Workstation 是一款跨平臺的桌面級虛擬化軟件,可以使用 Vmware 創建虛擬機,我們一般使用 Linux 虛擬機(目前主流的 Linux 發行版是 Ubuntu)&…

Linux下終端命令行安裝常見字體示例

一、準備工作: 準備好要安裝的字體文件,如宋體、微軟雅黑(simsun.ttc、msyh.ttc)。進入字體路徑: /usr/share/fonts,使用root權限,新建一個目錄shell_fonts。 二、命令行安裝字體: 將要安裝…

CentOS中在線安裝Docker(超詳細)

1)檢查安裝docker的基本要求: 64位CPU架構的計算機,目前不支持32為CPU架構的計算機 系統的Linux內核版本為3.10及以上 開啟CGroups和namespace功能 2)使用命令查看當前系統的內核版本 [rootlocalhost ~]# uname -r 3.10.0-862…

武漢昊衡科技OLI光纖微裂紋檢測儀:高密度光器件的精準守護者

隨著AI技術應用越來越廣,算力需求激增,光通信系統正加速向小型化、高密度、多通道方向演進。硅光芯片、高速光模塊等核心器件內部的光纖通道數量成倍增加,波導結構愈發精細,傳統檢測手段因分辨率不足、效率低下,難以精…

Java數據結構——Stack

Stack 棧的概念和使用棧的概念棧的使用 棧的應用出棧元素序列有效的括號棧的壓入、彈出序列逆波蘭表達式最小棧 棧的概念和使用 棧的概念 棧(Stack):一種特殊的線性表,只允許再棧的一端進行插入和刪除元素,這一端點被稱為棧頂,另…

神經網絡與計算機視覺

2016 年,隨著 AlphaGo 在圍棋比賽中擊敗李世石,“人工智能”、“神經網絡”、“深度 學習”等字眼便越來越多的出現在大眾眼前,智能化好像成為一種不可逆轉的趨勢,帶給大家新奇感的同時也帶來了一絲憂懼:在不遠的未來,機器是否真的擁有思維和情感?《終結者》中天網大戰人…

VS2019 與gitcode團隊管理

1、安裝git 點擊下一步安裝即可 2、vs2019連接gitcode 然后更改本地的代碼添加文件等都可以進行遠程同步操作了

Python類和對象四(十三)

魔法方法: 按位運算 按位于運算 只要相同才是1 或運算: 只要某個位是1結果就是1 、 按位非 將結果取反 按位異或: 左移和右移運算符: 右移兩位 右移動n位,就是除以2的n次方 左移兩位: 左移n位就是乘…

如何設置極狐GitLab 議題截止日?

極狐GitLab 是 GitLab 在中國的發行版,關于中文參考文檔和資料有: 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 截止日期 (BASIC ALL) 可以在議題中使用截止日期,來跟蹤截止日期并確保功能按時交付。用戶至少需要報告者權限才…

如何在 Conda 環境中降級 Python 版本:詳細指南

如何在 Conda 環境中降級 Python 版本:詳細指南 Python 版本的管理在開發過程中至關重要,特別是在處理不同項目需求時。對于使用 Conda 環境的 Python 程序員來說,版本管理不僅僅是安裝不同的 Python 版本,還涉及到依賴關系的兼容…

【隨筆】地理探測器原理與運用

文章目錄 一、作者與下載1.1 軟件作者1.2 軟件下載 二、原理簡述2.1 空間分異性與地理探測器的提出2.2 地理探測器的數學模型2.21 分異及因子探測2.22 交互作用探測2.23 風險區與生態探測 三、使用:excel 一、作者與下載 1.1 軟件作者 作者: DOI: 10.…

使用達夢官方管理工具SQLark快速生成數據庫ER圖并導出

在數據庫設計與開發中,實體-關系圖(ER 圖)作為數據建模的核心工具,能夠直觀呈現表結構、字段屬性及表間關系,是團隊溝通和文檔維護的重要工具。然而,對于許多使用達夢數據庫的開發者來說,可用的…

單精度浮點運算/定點運算下 MATLAB (VS) VIVADO

VIVADO中單精度浮點數IP核計算結果與MATLAB單精度浮點數計算結果的對比 MATLAB定點運算仿真,對比VIVADO計算的結果 目錄 前言 一、VIVADO與MATLAB單精度浮點數運算結果對比 二、MATLAB定點運算仿真 總結 前言 本文介紹了怎么在MATLAB中使用單精度浮點數進行運算…

力扣-141.環形鏈表

題目描述 給你一個鏈表的頭節點 head ,判斷鏈表中是否有環。 如果鏈表中存在環 ,則返回 true 。 否則,返回 false 。 class Solution { public:bool hasCycle(ListNode *head) {ListNode *fast head;ListNode *slow head;while (fast! n…

RESTful學習筆記(一)

Web發展 一、API 程序硬件接口(Application Programming Interface),是預先定義好的邏輯函數,軟件系統不同組成部分銜接的約定,直接調用函數,無序訪問代碼細節,分為SDK和Web應用接口兩類 SDK…