首页  >  文章  >  Java  >  Spring Boot 中映射的最佳实践

Spring Boot 中映射的最佳实践

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-10 06:09:29779浏览

Best Practices for Mapping in Spring Boot

在Spring Boot 應用程式中決定將DTO 對應到實體(反之亦然)的最佳實踐時,需要考慮幾個關鍵因素:簡單性、可維護性、效能和可測試性。每種方法都有其優點,因此最佳實踐取決於您的專案的要求。以下是不同方法以及何時使用它們的詳細資訊:

1. 使用像> (大型專案的首選)

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);
    }
}

2. 使用像> (用於快速動態映射)

ModelMapper 在執行時期動態地對應 DTO 和實體之間的欄位。
最適合:快速設置,尤其是在原型設計中或當您不想為許多字段手動編寫映射邏輯時。
為什麼選擇 ModelMapper:

  • 易於設置: 需要很少的設置,並且適用於簡單的用例。
  • 動態映射:非常適合實體和 DTO 具有相似結構且您不想編寫單獨的映射方法的情況。

範例:

        ModelMapper modelMapper = new ModelMapper();
        ClientDTO clientDTO = modelMapper.map(client, ClientDTO.class);
        Client client = modelMapper.map(clientDTO, Client.class);

何時使用 ModelMapper:

  • 當專案規模較小或中等,您不想編寫單獨的映射器。
  • 當您的 DTO 和實體的結構非常相似且不需要太多自訂時。

3. 手動映射(最適合小型專案或特定案例)

手動映射涉及您自己編寫轉換程式碼,通常使用簡單的 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 和实体存在的小型或简单项目中。
  • 当您需要最大限度地控制映射逻辑时。
  • 对于映射库可能开销太大的边缘情况。

选择映射方法的关键考虑因素

可维护性
  • MapStruct 随着项目的增长更容易维护,因为它会自动生成映射代码。
  • 手动映射在大型项目中可能会变得更难维护,因为每个 DTO 实体对都需要单独的方法。
  • ModelMapper 如果您需要大量自定义逻辑,它很快就会变得难以维护,因为它是动态的并且不强制执行编译时检查。
表现
  • MapStruct 具有高性能,因为映射是在编译时生成的。这使其成为性能关键型应用的理想选择。
  • 手动映射也很有效,但它可能会引入人为错误并且更加冗长。
  • ModelMapper 可能会更慢,因为它在运行时使用反射来映射字段。
映射的复杂性
  • 对于简单映射:手动映射ModelMapper可能就足够了。
  • 对于复杂映射(嵌套对象、自定义字段名称或转换),首选 MapStruct手动映射,因为它提供更多控制。
项目规模
  • 在小型项目中,手动映射通常就足够了并且易于维护。
  • 对于具有多个实体和 DTO 的大型项目,最好使用 MapStruct 来减少样板文件并提高可读性。

一般最佳实践:

  • 对于可维护性、性能和编译时安全性至关重要的大型项目,请使用 MapStruct
  • 在小型项目或需要编写非常具体的转换逻辑时使用手动映射
  • 避免在大型或复杂项目中使用 ModelMapper,因为使用反射进行运行时映射可能会很慢并且容易出错。
  • 始终努力保持 DTO 简单,仅包含必要的数据,并避免在其中包含域逻辑。
  • 映射时正确处理空安全和边缘情况(例如可选字段、集合)。
  • 如果您的 DTO 经常更改,MapStruct 等工具将通过自动生成代码并提供编译时反馈来帮助您更快地适应。

结论

  • 对于存在许多 DTO 和实体且映射重复的大型应用程序,MapStruct 通常是最佳实践。
  • 对于具有最少映射的小型项目,手动映射就足够了并且使事情变得简单。
  • ModelMapper 可用于快速原型或简单用例,但由于性能和可维护性问题,它不是生产环境的最佳选择。

作者

  • @mohamedamine.mhenni

支持

如需支持,请发送电子邮件至 mhenni.medamine@gmail.com 。

执照

麻省理工学院

以上是Spring Boot 中映射的最佳实践的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn