在Spring Boot 應用程式中決定將DTO 對應到實體(反之亦然)的最佳實踐時,需要考慮幾個關鍵因素:簡單性、可維護性、效能和可測試性。每種方法都有其優點,因此最佳實踐取決於您的專案的要求。以下是不同方法以及何時使用它們的詳細資訊:
MapStruct 是一個編譯時程式碼產生器,可自動執行 DTO 和實體之間的對應過程。
最適合: 擁有許多 DTO 和實體並且希望避免重複的手動映射程式碼的大型專案。
為什麼 MapStruct 是不錯的選擇:
- 效能:因為它在編譯時會產生映射程式碼,所以與執行時間解決方案相比非常有效率。 類型安全性:如果映射不正確或遺失,則會出現編譯時錯誤,從而減少執行時失敗的機會。
- 可維護性:它為您產生所有樣板程式碼,減少重複。
- 自訂映射支援:您可以輕鬆地為複雜欄位定義自訂映射(例如,不同的欄位名稱、巢狀物件)。
何時使用 MapStruct:
- 當您有許多 DTO 和實體要映射時。
- 當效能是一個問題時(因為它是編譯時產生的)。
- 當您想要減少樣板程式碼但保持對映射的控制。
public interface BaseMapper<D, E> { D toDto(E entity); E toEntity(D dto); }
@Mapper(componentModel = "spring") public interface ClientMapper extends BaseMapper<ClientDTO, User> { // MapStruct will automatically inherit the methods from BaseMapper }
@Mapper(componentModel = "spring") public interface SentimentMapper extends BaseMapper<SentimentDTO, Product> { // Inherits from BaseMapper }
您應該如下整理文件:
src └── main └── java └── com └── yourapp ├── mapper # Package for mappers │ ├── BaseMapper.java # Abstract base mapper │ ├── ClientMapper.java # Client-specific mapper │ └── SentimentMapper.java # Sentiment-specific mapper
範例:如何在服務中使用映射器
package com.yourapp.service; import com.yourapp.dto.UserDTO; import com.yourapp.entity.User; import com.yourapp.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class ClientService { private final ClientMapper clientMapper; // Constructor injection (preferred method) public UserService(ClientMapper clientMapper) { this.clientMapper = clientMapper; } // Method to convert Client entity to ClientDTO public ClientDTO getClientDto(Client client) { return clientMapper.toDto(client); } // Method to convert ClientDTO to Client entity public User createClientFromDto(ClientDTO clientDTO) { return clientMapper.toEntity(clientDTO); } }
ModelMapper 在執行時期動態地對應 DTO 和實體之間的欄位。
最適合:快速設置,尤其是在原型設計中或當您不想為許多字段手動編寫映射邏輯時。
為什麼選擇 ModelMapper:
- 易於設置: 需要很少的設置,並且適用於簡單的用例。
- 動態映射:非常適合實體和 DTO 具有相似結構且您不想編寫單獨的映射方法的情況。
範例:
ModelMapper modelMapper = new ModelMapper(); ClientDTO clientDTO = modelMapper.map(client, ClientDTO.class); Client client = modelMapper.map(clientDTO, Client.class);
何時使用 ModelMapper:
- 當專案規模較小或中等,您不想編寫單獨的映射器。
- 當您的 DTO 和實體的結構非常相似且不需要太多自訂時。
手動映射涉及您自己編寫轉換程式碼,通常使用簡單的 getter/setter 呼叫。
最適合:小型專案、簡單映射,或當您需要完全控制映射過程的各個方面時。
為什麼手動映射是一個不錯的選擇:
- 簡單映射:如果您只有幾個 DTO 和實體,手動映射可以直接且易於實現。
- 完全控制:您可以完全控制映射的完成方式,這在映射過程中進行複雜邏輯或資料轉換時非常有用。
範例:
public class ClientMapper { public ClientDTO toDto(Client client) { ClientDTO clientDTO = new ClientDTO(); clientDTO.setEmail(client.getEmail()); return clientDTO; } public User toEntity(ClientDTO clientDTO) { Client client = new User(); client.setEmail(clientDTO.getEmail()); return client; } }
何時使用手動對映:
- 在只有少数 DTO 和实体存在的小型或简单项目中。
- 当您需要最大限度地控制映射逻辑时。
- 对于映射库可能开销太大的边缘情况。
如需支持,请发送电子邮件至 mhenni.medamine@gmail.com 。
麻省理工学院
以上是Spring Boot 中映射的最佳实践的详细内容。更多信息请关注PHP中文网其他相关文章!