比较 Java 中的 ModelMapper 和 MapStruct:自动映射器的强大功能

news2025/2/28 6:37:59

        了解如何在自动映射器 ModelMapper 和 MapStruct 之间进行选择,以提高生产力和可维护性,并减少数据映射中的错误。

        在 Java 应用程序中, 数据映射 是一项常见任务,涉及将对象从一种类型转换为另一种类型。这个过程可能会变得复杂而乏味,特别是在处理大型嵌套类时。为了简化此任务,开发人员经常求助于自动映射框架。Java 中自动映射的两个流行选择是 ModelMapper 和 MapStruct。在本文中,我们将比较这些框架,并探讨为什么使用自动映射器比手动映射更有好处。

对自动制图器的需求

在深入比较之前,让我们先了解为什么自动映射器比手动映射更受青睐。以下是一些关键原因:

  1. 生产力:手动映射需要编写样板代码来在类之间传输数据。它可能非常耗时且容易出错,尤其是在具有许多类的应用程序中。自动映射器为您生成映射代码,节省宝贵的开发时间。
  2. 可维护性:随着应用程序的发展,类可能会发生变化,导致映射逻辑频繁更新。自动映射器会自动处理这些更改,从而降低更新期间引入错误的风险。
  3. 减少人为错误:手动映射涉及编写重复代码,这增加了人为错误的可能性。自动映射器确保类之间的映射一致且准确。
  4. 可读性:自动映射器提供了更干净、更简洁的映射代码,使开发人员更容易理解数据流。
  5. 灵活性:自动映射器通常允许自定义和配置来处理复杂的映射场景。

ModelMapper 与 MapStruct

ModelMapper 和 MapStruct 是 Java 生态系统中强大且广泛使用的映射框架。让我们根据各种因素对它们进行比较:

  1. 易于使用:ModelMapper 以其简单性和易用性而闻名。它自动映射具有相同名称和数据类型的字段。另一方面,MapStruct 要求开发人员编写显式映射接口,这可能导致更多的初始设置,但提供了对映射过程的更多控制。
  2. 性能:由于其编译时代码生成方法,MapStruct 的性能优于 ModelMapper。ModelMapper 依赖于反射,这可能会产生轻微的性能开销。
  3. 配置:ModelMapper提供了丰富的配置选项,支持复杂的映射场景。MapStruct 作为编译时映射器,需要显式映射接口,这既可以是优点(静态类型),也可以是缺点(更多初始设置)。
  4. 定制:两个框架都允许定制转换器来处理特定的映射情况。然而,ModelMapper 提供了更多的内置转换,并且在许多场景中需要更少的自定义转换器。

ModelMapper 和 MapStruct 都是 Java 中自动映射的绝佳选择,决定使用其中一种主要取决于项目的具体要求和偏好。

超越 DTO:自动映射器的各种用例

除了简单的DTO映射之外,自动映射器还可以通过多种方式使用。让我们探讨一些其他用例:

  1. 层之间的转换:自动映射器可以将域对象转换为 DTO、表示模型或应用程序层之间的任何其他数据转换。
  2. 遗留代码中的适配器和转换:在处理遗留代码库时,自动映射器可以充当适配器来弥合新旧类结构之间的差距。它们使得引入现代数据模型变得更容易,同时仍然支持现有的代码库。
  3. API版本控制:随着应用程序的发展并引入新的API版本,自动映射器可以在不同版本之间转换数据模型,确保向后兼容性和平滑迁移。

        该表比较了 Java 生态系统中著名的自动映射框架:ModelMapper 和 MapStruct。这些框架提供了在不同类型之间转换对象的有效解决方案,消除了手动映射的需要并提高了开发人员的工作效率。

        ModelMapper 以其用户友好的方法脱颖而出,需要最少的设置和配置。其简单的用法使开发人员能够快速开始数据映射任务。该框架丰富的配置选项提供了极大的灵活性,使其能够轻松处理复杂的映射场景。此外,ModelMapper支持自定义转换器,可以方便地满足特定的映射要求。

        另一方面,MapStruct 遵循编译时代码生成方法,因此与 ModelMapper 相比具有卓越的性能。它需要显式映射接口的定义,这可能需要更多的设置工作。然而,这种方法可以更好地控制映射过程,为开发人员提供细粒度的定制。

        ModelMapper 和 MapStruct 与Spring 和CDI等流行的 Java 框架无缝集成,允许开发人员通过依赖注入支持将自动映射合并到他们的项目中。这种无缝集成使开发人员能够充分利用这些框架的功能,同时受益于 ModelMapper 或 MapStruct 强大的映射功能。

        ModelMapper 和 MapStruct 之间的选择取决于项目要求和偏好。ModelMapper 以其简单性和功能丰富的配置而著称,而 MapStruct 则具有出色的性能并提供对映射的更多控制。开发人员可以根据自己的具体需求自信地选择最合适的框架,增强整体开发体验并简化 Java 应用程序中的数据映射任务。

 

实践会话:将交付映射到DeliveryDTO

让我们深入实践一下,我们将使用 ModelMapper 和 MapStruct 将类映射Delivery到类DeliveryDTO

首先我们来定义Delivery类和DeliveryDTO类:

public class Delivery {

    private UUID trackId;

    private LocalDate when;

    private String city;

    private String country;

}



public record DeliveryDTO(String id, String when, String city, String country) {

}

使用映射结构:

1. 将 MapStruct 依赖项添加到您的项目中。对于Maven:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

2.创建映射接口:

@Mapper

public interface DeliveryMapper {



    @Mapping(target = "trackId", source = "id")

    Delivery toEntity(DeliveryDTO dto);



    @Mapping(target = "id", source = "trackId")

    DeliveryDTO toDTO(Delivery entity);

}

3. 执行映射:

DeliveryMapper mapper = Mappers.getMapper(DeliveryMapper.class);
Delivery delivery = new Delivery(UUID.randomUUID(), LocalDate.now(), "Salvador", "Brazil");
DeliveryDTO dto = this.mapper.toDTO(delivery);
Delivery entity = this.mapper.toEntity(dto);

使用模型映射器:

1. 将 ModelMapper 依赖项添加到您的项目中。对于Maven:

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>${org.modelmapper.version}</version>
</dependency>

2. 创建一个新的ModelMapper实例:

ModelMapper modelMapper = new ModelMapper();

3. 设置配置和转换器: 不幸的是,它ModelMapper不适用于记录。因此,我们必须首先将其转换为类,并创建并定义一个转换器并UUID键入,LocalDate如下面的代码所示。


ModelMapper mapper = new ModelMapper();

mapper.getConfiguration()
        .setFieldMatchingEnabled(true)
        .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);


Converter<String, UUID> uuidConverter = new AbstractConverter<>() {
    @Override
    protected UUID convert(String source) {
        return UUID.fromString(source);
    }

};


Converter<String, LocalDate> localDateConverter = new AbstractConverter<>() {
    @Override
    protected LocalDate convert(String source) {
       return LocalDate.parse(source);
    }
};


mapper.addConverter(uuidConverter);
mapper.addConverter(localDateConverter);

TypeMap<DeliveryDTO, Delivery> typeMap = this.mapper.createTypeMap(DeliveryDTO.class, Delivery.class);
typeMap.addMappings(mapping -> mapping.using(uuidConverter).map(DeliveryDTO::id, Delivery::setTrackId));

4. 执行映射:

Delivery delivery = new Delivery(UUID.randomUUID(), LocalDate.now(), "New York", "USA");
DeliveryDTO deliveryDTO = modelMapper.map(delivery, DeliveryDTO.class);

        在本次动手实践中,我们了解了如何使用 ModelMapper 和 MapStruct 将Delivery类映射到类DeliveryDTO。这两个框架都使这种映射变得毫不费力,并允许开发人员专注于构建应用程序的核心逻辑,而不是花费时间进行手动映射。

结论

        ModelMapper 和 MapStruct 等自动映射器比手动映射具有显着优势,可以提高生产率、可维护性并减少数据映射中的错误。选择合适的映射器取决于您项目的具体需求。尽管如此,ModelMapper 和 MapStruct 仍然是强大的工具,可以简化复杂的映射场景,并帮助开发人员交付更高效、更可维护的 Java 应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/862261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈Spring与字节码生成技术

概要 今天来谈一谈我们熟知的Spring框架和字节码技术有什么联系。 Java程序员几乎都了解Spring。 它的IoC&#xff08;依赖反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;功能非常强大、易用。而它背后的字节码生成技术&#xff08;在运行时&#xff0c;根据需要…

Linu学习笔记——常用命令

Linux 常用命令全拼&#xff1a; Linux 常用命令全拼 | 菜鸟教程 一、切换root用户 1.给root用户设置密码 sudo passwd root 2.输入密码&#xff0c;并确认密码 3.切换到root用户 su&#xff1a;Swith user(切换用户) su root 二、切换目录 目录结构&#xff1a;Linux 系…

APP外包开发的H5开发框架

跨平台移动应用开发框架允许开发者使用一套代码在多个操作系统上构建应用程序&#xff0c;从而节省时间和资源。以下是一些常见的跨平台移动应用开发框架以及它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…

再论态势感知中的几个问题

1、态势中的状态信息与趋势信息有何不同 在分析和决策过程中&#xff0c;态势是指当前的情境、环境或状况。状态信息和趋势信息是对态势的不同方面进行描述和分析的方式。 状态信息是关于当前态势的实时或静态描述。它提供的是当前的数据、指标或状态的具体数值或描述。例如&am…

使用python-magic和wxPython识别文档类型

以下是一篇关于使用python-magic模块和wxPython库识别文档类型的相关博客文章的示例&#xff1a; 摘要&#xff1a; 本文介绍了如何使用python-magic模块和wxPython库创建一个简单的文件列表应用程序&#xff0c;该应用程序可以显示所选文件夹中文件的类型。 介绍&#xff1…

【三维重建】【深度学习】instant-nsr-pl代码Pytorch实现--训练自己的数据集

【三维重建】【深度学习】instant-nsr-pl代码Pytorch实现–训练自己的数据集 基于Instant-NGP的神经表面重建&#xff1a;该存储库包含 NeRF 和 NeuS 的简洁且可扩展的实现&#xff0c;用于基于 Instant-NGP 和 Pytorch-Lightning 框架的神经表面重建&#xff0c;旨在为基于 Ne…

ACM Journals的Word模板使用心得

按照说明一步一步按照顺序调整格式&#xff0c;体力活&#xff0c;考验耐心细心。 两个模板&#xff0c;第一个是 Submission Template投稿用的&#xff0c;第二个是Primary Article Template接收后用的。 及时保存备份&#xff0c;以便恢复到最初满意的状态。 格式确定后&a…

CSDN到底要多少积分才有排名(图解)

2016年8月16日的截图&#xff1a; 2016年8月17日的截图&#xff1a; CSDN的排名是完全按照积分排的&#xff0c;只隔了22分而已&#xff0c;千里之外和2万名的差别就是卡在这个地方。 2016年10月18日的截图&#xff1a; 这是刚刚进入前7000名&#xff0c;刚好访问也是刚刚突破4…

Linux系统调试课:Linux Kernel Printk

🚀返回专栏总目录 文章目录 0、printk 说明1、printk 日志等级设置2、屏蔽等级日志控制机制3、printk打印常用方式4、printk打印格式0、printk 说明 在开发Linux device Driver或者跟踪调试内核行为的时候经常要通过Log API来trace整个过程,Kernel API printk()是整个Kern…

Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL

导航&#xff1a; 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式面试题汇总源码_vincewm的博客-CSDN博客 目录 一、基本区别 1.1 基本特性 1.2 Oracle和MySQL如何做技术选型&#xff1f; 1.3 RDBM…

图解java.util.concurrent并发包源码系列——深入理解ReentrantReadWriteLock读写锁,看完可以吊打面试官

图解java.util.concurrent并发包源码系列——深入理解ReentrantReadWriteLock读写锁&#xff0c;看完可以吊打面试官 ReentrantReadWriteLock的作用ReentrantReadWriteLock的原理ReentrantReadWriteLock源码解析构造方法获取写锁和读锁对象计算读锁被持有数和写锁被持有数的位移…

爆笑,打地鼠的极限,PyAutoGUI的开始~

游戏地址&#xff1a;http://www.4399.com/flash/178030_3.htm 视频教程地址&#xff1a;https://www.bilibili.com/video/BV1gm4y1x7QW/ 介绍 当提到自动化控制鼠标和键盘的Python库时&#xff0c;pyautogui是一个不可忽视的工具。它为用户提供了简单而强大的功能&#xff…

【JAVA基础】- 同步非阻塞模式NIO详解

【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO&#xff08;Non-Blocking IO&#xff09;是同步非阻塞方式来处理IO数据。…

主题模型分析-【LDA】

主题模型能够自动将文本语料库编码为一组具有实质性意义的类别。这些类别称为主题。 主题模型分析的典型代表就是本篇文章将要介绍的隐含迪利克雷分布&#xff0c;也就是LDA。 假设我们有一个文档或者新闻的集合&#xff0c;我们想将他们分类为主题。 我们设置好主题数量后&am…

Java中创建对象的方式

文章目录 一、使用new关键字二、使用反射机制三、使用clone方法四、使用反序列化 一、使用new关键字 下面是使用 new 关键字创建对象的示例代码&#xff0c;同时演示了如何调用不同构造函数的方式&#xff1a; public class Person {private String name;private int age;pub…

超人PDF解密助手:pdf怎么解除编辑权限

PDF文件带有编辑权限&#xff0c;想要取消PDF文件的限制&#xff0c;该如何操作&#xff1f; 打开PDF编辑器&#xff0c;点击工具栏中的文件&#xff0c;选择属性按钮&#xff0c;进入到熟悉感界面之后&#xff0c;点击安全&#xff0c;然后我们点击权限下拉框&#xff0c;选择…

LaTeX基础学习笔记

LaTeX是一个文本编辑器。其类似于markdown&#xff0c;使用特殊标记和代码来修改文本格式&#xff0c;创建特殊字符等。可以使用overleaf在线LaTex编辑器编写LaTeX并转换为pdf文件&#xff08;https://www.overleaf.com/&#xff09; 同时推荐一个网站http://detexify.kirelab…

Mysql 复杂查询丨联表查询

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; JOIN&#xff08;联表查询&#xff09; 联表查询&#xff08;Join&#xff09;是一种在数据库中使用多个表进行关联查询的操作。它通过使用 JOIN 关键字将多个表连接在…

[保研/考研机试] KY163 素数判定 哈尔滨工业大学复试上机题 C++实现

题目链接&#xff1a; 素数判定https://www.nowcoder.com/share/jump/437195121691718831561 描述 给定一个数n&#xff0c;要求判断其是否为素数&#xff08;0,1&#xff0c;负数都是非素数&#xff09;。 输入描述&#xff1a; 测试数据有多组&#xff0c;每组输入一个数…

橡胶履带行业分析报告2023-2029

橡胶履带行业分析报告&#xff0c;2022年全球橡胶履带市场规模达到了19.2亿美元 橡胶履带是用橡胶和骨架材料制成的履带&#xff0c;它被广泛用于工程机械、农用机械和军用装备。橡胶履带行业产业链主要原材料包括橡胶、芯金、炭黑、钢丝、各类橡胶化学助剂等&#xff0c;上游…