0

0

Spring Boot 中映射的最佳实践

DDD

DDD

发布时间:2024-10-11 19:03:18

|

462人浏览过

|

来源于dev.to

转载

spring boot 中映射的最佳实践

在 spring boot 应用程序中决定将 dto 映射到实体(反之亦然)的最佳实践时,需要考虑几个关键因素:简单性、可维护性、性能和可测试性。每种方法都有其优点,因此最佳实践取决于您的项目要求。以下是不同方法以及何时使用它们的详细信息:

1. 使用 > 等库(大型项目首选)

mapstruct 是一个编译时代码生成器,可自动执行 dto 和实体之间的映射过程。
最适合: 拥有许多 dto 和实体并且希望避免重复的手动映射代码的大型项目。
为什么 mapstruct 是一个不错的选择:

性能:因为它在编译时生成映射代码,所以与运行时解决方案相比非常高效。 类型安全:如果映射不正确或丢失,则会出现编译时错误,从而减少运行时失败的机会。 可维护性:它为您生成所有样板代码,减少重复。 自定义映射支持:您可以轻松地为复杂字段定义自定义映射(例如,不同的字段名称、嵌套对象)。

何时使用 mapstruct:

  • 当您有许多 dto 和实体要映射时。
  • 当性能是一个问题时(因为它是编译时生成的)。
  • 当您想要减少样板代码但保持对映射的控制时。
2935915536​​57
@mapper(componentmodel = "spring")
public interface clientmapper extends basemapper {
    // mapstruct will automatically inherit the methods from basemapper
}
@mapper(componentmodel = "spring")
public interface sentimentmapper extends basemapper {
    // 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 具有相似结构且您不想编写单独的映射方法的情况。

示例:

魔珐星云
魔珐星云

无需昂贵GPU,一键解锁超写实/二次元等多风格3D数字人,跨端适配千万级并发的具身智能平台。

下载
        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 。

执照

麻省理工学院

相关标签:

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

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

102

2025.08.06

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

135

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

389

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

68

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

32

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

114

2025.12.24

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

0

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

2

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

9

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号