DTO和VO簡介與使用

一、什麼是DTO和VO

Data Transfer Object (DTO) 和 Value Object (VO) 是在軟體開發中非常常見的兩種數據結構,但是它們的用途和含義有所不同。

DTO 在不同層次的應用程序之間傳輸數據,並且DTO負責封裝與業務相關的數據和傳輸規則,而且它們是完全分離的層次結構。DTO 對象通常是無狀態,這意味著當數據傳輸完成後就可以將 dto 對象捨棄,可以用於 RPC(Remote Procedure Call) 等情境。

VO 不是用於數據傳輸的,而是用於在前端與用戶交互,展示業務相關的數據。將一個領域模型的狀態「塞」到vo中,以傳遞給前端ui層。

二、DTO and VO示例

1. DTO示例

public class UserDTO {
    private Long id;
    private String name;
    private Integer age;
    // getter and setter ...
}

DTO對象設計簡單明了,注意到的是,我們定義了一個公開的無參數的構造器,這是因為我們將要使用反序列化技術將相關數據解析成與此對象相對應的實例。

2. VO示例

public class UserVO {
    private String name;
    private Integer age;    
    // getter and setter ...
}

請留意到這裡 VO 與 DTO 之間的顯著差異。首先,我們沒有定義 ID,它不是為了向業務層返回而存在的。其次是 public 無參數構造器,也是為了前端界面進行數據組裝時所必須的。顯然,我們不需要複製欄位,更不需要加額外的方法,因為 VO 並不承擔任何業務邏輯。

三、DTO and VO在實戰開發中的應用

1. 應用場景

在應用程序中,DTO 和 VO 應該扮演著不同的角色。DTO 可以用於跨網路傳輸數據,可以克服不同操作系統和語言之間的差異。數據在網路傳輸時,可能會發生丟失。DTO 可以在應用程序的不同層之間傳遞數據,減少數據層次結構。

VO 在前端展示中扮演著非常重要的角色。UI 設計師可以使用 VO 減少 HTML 模板中的邏輯。VO 還有助於確保在請求超過一次時整個數據的一致性。

2. 實戰應用舉例

假設我們有一個用戶管理系統,並且我們需要展示用戶列表到UI層。假設有兩個前端頁面需要用戶列表數據:用戶管理界面和用戶詳情頁面。

這個時候,我們可以實現兩個DTO對象:UserListDTO用於傳遞完整的用戶列表信息和 UserDetailsDTO 用於傳遞單個用戶的詳細信息。

//UserListDTO
public class UserListDTO{
    private Long userId;
    private String userName;
    private Integer userAge;   
    // getter and setter ...
}

//UserDetailsDTO
public class UserDetailsDTO{
    private String userName;
    private Integer userAge;
    private String userAddress;
    private Integer userRole;
    // getter and setter ...
}

//UserMapper.java
public UserListDTO mapToUserListDTO(UserEntity entity){
    UserListDTO dto = new UserListDTO();
    dto.setUserId(entity.getId());
    dto.setUserName(entity.getName());
    dto.setUserAge(entity.getAge());
    return dto;
}

//UserController.java
@GetMapping("/all")
public UserListDTO getAllUsers(){
    List users = userService.getAllUsers();
    return users.stream()
                .map(user->userMapper.mapToUserListDTO(user))
                .collect(Collectors.toList());
}

//UserController.java
@GetMapping("/{id}")
public UserDetailsDTO getUserDetails(@PathVariable Long id){
    UserEntity user = userService.getUserById(id);
    return userMapper.mapToUserDetailsDTO(user);
}

這個時候,前端頁面也相應發生了變化,顯示用戶列表和單個用戶詳情信息。前端接收到的數據格式也與DTO中定義的完全一致。

四、結論

DTO和VO不應該僅僅只是一個由getter和setter方法組成的帶注釋 Java Bean,它們應該是有目的的數據結構,每個欄位都需要在DTO或VO上進行明確的分類和注釋。DTO 和 VO 廣泛應用於各級別的應用程序,使數據傳輸變得更加高效,更容易管理,無論是對於後端還是前端來說。

原創文章,作者:EMAZL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/334821.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EMAZL的頭像EMAZL
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相關推薦

  • Java2D物理引擎簡介及應用

    本文將介紹Java2D物理引擎的基本概念、實現原理及應用案例,以及對應代碼示例。 一、物理引擎概述 物理引擎是一種計算機程序,用於模擬物理系統中的對象和其互動,如重力、碰撞、彈力等…

    編程 2025-04-29
  • Spring Boot中使用DTO、Controller、Service、Mapper進行開發

    本文將介紹如何在Spring Boot中使用DTO、Controller、Service、Mapper等技術進行開發。 一、DTO DTO(Data Transfer Object…

    編程 2025-04-28
  • Django框架:從簡介到項目實戰

    本文將從Django的介紹,以及如何搭建Django環境開始,逐步深入到Django模型、視圖、模板、表單,最後通過一個小型項目實戰,進行綜合性的應用,讓讀者獲得更深入的學習。 一…

    編程 2025-04-28
  • Python三體運動簡介

    本文將從多個方面詳細闡述Python三體運動,包括什麼是三體運動,三體運動的公式與原理,實現三體運動的Python代碼等內容。 一、什麼是三體運動? 三體運動是指三個天體相互作用所…

    編程 2025-04-27
  • Java中的殭屍進程簡介與解決方法

    本文將對Java中的殭屍進程進行詳細闡述,並給出幾種解決方法。 一、殭屍進程的概念 在操作系統中,進程是指正在執行的程序。當一個進程創建了一個子進程,而該子進程完成了任務卻沒有被父…

    編程 2025-04-27
  • PyTorch模塊簡介

    PyTorch是一個開源的機器學習框架,它基於Torch,是一個Python優先的深度學習框架,同時也支持C++,非常容易上手。PyTorch中的核心模塊是torch,提供一些很好…

    編程 2025-04-27
  • Python操作DB文件簡介

    本文將從以下幾個方面詳細闡述如何使用Python操作DB文件: 創建和打開DB文件 執行SQL語句 讀取和寫入數據 關閉DB文件 一、創建和打開DB文件 Python內置了SQLi…

    編程 2025-04-27
  • Python寫Word模板簡介

    Python可以用來生成Word文檔,讓你可以自動化生成報表、合同、申請表等文檔。本文將從多個方面詳細介紹Python寫Word模板的方法和技巧。 一、Word模板的結構 要生成W…

    編程 2025-04-27
  • 雪峰老師簡介

    解答:深度剖析雪峰老師的IT技術經驗 一、教育背景 雪峰老師本科畢業於西安電子科技大學,獲得計算機科學與技術學位。隨後,他在美國獲得了計算機科學碩士學位。 雪峰老師所在大學是國內頂…

    編程 2025-04-27
  • Start UML簡介

    Start UML是可視化建模工具,採取UML標準的符號和符號語義,特別針對Java開發優化的能力。Start UML允許您創建和編輯UML 1.0,1.1,1.2,2.0或2.1…

    編程 2025-04-25

發表回復

登錄後才能評論