舉個例子講解DTO負責幹啥

ivanlee717發表於2024-12-03

dto

在Spring Boot的開發過程中,使用DTO(Data Transfer Object)層是一個很常見的做法。DTO層是在應用程式的業務邏輯層和資料訪問層之間引入的一箇中間層,用於在不同層之間傳輸資料。本文將介紹DTO層的基本語法和為什麼在Spring Boot開發中需要使用DTO層,並提供實際案例程式碼。
image-20241129111423665

DTO(Data Transfer Object)主要是在應用程式的不同層之間傳輸資料,特別是從服務層到展示層(即控制器層),以及從展示層到客戶端。具體來說,DTO的作用和傳輸路徑如下:

從服務層到展示層:

  • 服務層:處理業務邏輯,可能涉及到多個資料庫操作、計算等。
  • 控制器層:接收HTTP請求,呼叫服務層的方法,然後將結果以DTO的形式返回給客戶端。

從客戶端到展示層

  • 客戶端:傳送包含資料的HTTP請求(例如POST請求)到伺服器。
  • 展示層:接收請求,將請求體中的資料繫結到DTO物件。
  • 服務層:處理DTO物件,進行業務邏輯處理,可能涉及儲存資料到資料庫等操作。

其實在之前的部落格當中,我們定義了一種返回給前端的格式,這就是一種傳輸模式image-20241129164357250

這次我們就簡單介紹一下與資料庫有交集的dto規範下的一種傳輸模式。

首先我們要定義好實體,就是我們資料庫的欄位,還是我們之前的那個資料庫,前兩篇文章可以看這裡

  1. [用一個專案把控制層、業務層、持久層說明白了,每一句話都講的很清楚 ](用一個專案把控制層、業務層、持久層說明白了,每一句話都講的很清楚 - ivanlee717 - 部落格園)
  2. lombok是怎麼用的 - ivanlee717 - 部落格園

我們希望用一個get請求傳進來的時候,返回對應id的賬戶資訊,用dto去傳輸是因為我們可能對同一個表進行多次的操作,每次返回不同的資訊,那麼直接對實體本身操作就會非常的複雜,所以我們單寫一個userDto類

package com.ivan.store.entity.dto;


import lombok.Data;

@Data
public class UserDto {
    private String username;
    private String password;
}

這個就是希望傳輸給前端的只有資料庫的賬號和密碼兩個欄位,然後加上註解就可以了。接下來去實現控制層的路徑:

@GetMapping("/{id}")
public UserDto findById(@PathVariable Integer id){
    UserDto userDto = userService.findById(id);
    return userDto;
}

@PathVariable 對映 URL 繫結的佔位符
透過 @PathVariable 可以將 URL 中佔位符引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以透過@PathVariable(“xxx”) 繫結到操作方法的入參中。

將id弄到我們findById方法裡面來尋找對應的資料,然後用dto格式返回。

    public UserDto findById(Integer id){
        User user = userMapper.findById(id);
        UserDto userDto = new UserDto();
        userDto.setUsername(user.getUsername());
        userDto.setPassword(user.getPassword());
        return userDto;
    }
<select id="findById" resultMap="UserEntityMap">
        SELECT * FROM t_user WHERE uid = #{id}
    </select>

這樣寫好之後,我們就可以根據id來獲取到賬戶資訊來實現一個簡易的dto使用。

image-20241203085059617

相關文章