MapStruct 中 Java Bean 映射代码生成器的基本使用

news2024/11/25 0:49:02

文章目录

  • 一、简介:
  • 二、背景:
  • 三、相关概念:
    • 1、映射器(Mapper):
    • 2、映射方法(Mapping Method):
    • 3、常规映射方法(Regular Mapping Method):
    • 4、嵌套映射方法(Nested Mapping Method):
    • 5、集合映射方法(Collection Mapping Method):
  • 四、使用案例
    • 1、添加依赖:
    • 2、创建转换器接口:
    • 3、生成转换器实现类:
    • 4、使用转换器:
  • 五、MapStruct 的底层原理
    • 1、扫描映射器接口:
    • 2、解析映射方法:
    • 3、生成转换代码:
    • 4、编译器处理:
    • 5、使用转换代码:

一、简介:

MapStruct是一个Java注解处理器,用于自动生成Java bean之间的映射代码。

它可以大大简化数据转换的过程,减少手动编写转换代码的工作量。
mapstruct

二、背景:

在实际的开发中,经常会遇到需要将一个Java bean的数据转换为另一个Java bean的情况。

在没有自动转换工具的情况下,我们通常需要手动编写转换代码,将源对象的属性值逐个赋值给目标对象的对应属性。

这样的转换代码通常会非常冗长且容易出错。

为了解决这个问题,MapStruct应运而生。

它通过在Java bean类上添加注解,指定源对象和目标对象之间的映射关系,然后使用注解处理器自动生成转换代码。

这样一来,开发人员就不再需要手动编写转换代码,大大提高了开发效率和代码质量。

三、相关概念:

1、映射器(Mapper):

映射器是一个接口,用于定义源对象和目标对象之间的转换规则。我们可以在映射器接口中定义多个抽象方法,每个方法都表示一个具体的转换规则。映射器接口上需要添加@Mapper注解,以告诉MapStruct要为该接口生成转换代码。

2、映射方法(Mapping Method):

映射方法是映射器接口中的抽象方法,用于定义源对象和目标对象之间的属性映射关系。映射方法上需要添加@Mapping注解,以指定源属性和目标属性之间的映射关系。

3、常规映射方法(Regular Mapping Method):

常规映射方法用于将源对象的属性值逐个赋值给目标对象的对应属性。这是最常见的一种映射方法,它的参数列表中需要包含源对象和目标对象。

4、嵌套映射方法(Nested Mapping Method):

嵌套映射方法用于处理源对象和目标对象之间的嵌套关系。当源对象和目标对象中存在嵌套对象时,我们可以使用嵌套映射方法来处理嵌套对象之间的转换。

5、集合映射方法(Collection Mapping Method):

集合映射方法用于处理源对象和目标对象之间的集合关系。当源对象和目标对象中存在集合属性时,我们可以使用集合映射方法来处理集合属性之间的转换。

总之,MapStruct是一个方便且强大的Java转换工具,可以帮助开发人员自动生成Java bean之间的映射代码,减少手动编写转换代码的工作量。它的使用非常简单,只需添加注解并定义转换规则即可。

四、使用案例

下面给出一个源对象和目标对象属性不同的例子来说明如何使用 MapStruct 进行转换。

假设我们有以下两个类:

public class SourceObject {
    private String name;
    private int age;
    // getters and setters
}

public class TargetObject {
    private String fullName;
    private int yearsOld;
    // getters and setters
}

源对象的 name 属性对应目标对象的 fullName 属性,源对象的 age 属性对应目标对象的 yearsOld 属性。

那么我们需要进行以下步骤:

1、添加依赖:

在项目的 pom.xml 文件中添加 MapStruct 依赖。

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>

2、创建转换器接口:

定义一个接口,使用 @Mapper 注解标记,并且指定 componentModel 参数为 spring(如果使用 Spring 框架)。

@Mapper(componentModel = "spring")
public interface ObjectMapper {
    @Mapping(source = "name", target = "fullName")
    @Mapping(source = "age", target = "yearsOld")
    TargetObject sourceToTarget(SourceObject sourceObject);
}

在这个例子中,我们使用 @Mapping 注解来指定源属性和目标属性之间的映射关系。

3、生成转换器实现类:

使用 Maven 构建项目,MapStruct 将会自动生成实现转换器接口的实现类。

4、使用转换器:

在代码中使用转换器进行对象转换。

SourceObject source = new SourceObject();
source.setName("John");
source.setAge(25);

ObjectMapper mapper = new ObjectMapperImpl(); // 自动生成的实现类
TargetObject target = mapper.sourceToTarget(source);

System.out.println(target.getFullName()); // 输出 "John"
System.out.println(target.getYearsOld()); // 输出 25

现在,你可以看到源对象的 name 属性被映射到了目标对象的 fullName 属性,源对象的 age 属性被映射到了目标对象的 yearsOld 属性。这样,你就可以使用 MapStruct 进行源对象和目标对象属性不同的映射转换了。

五、MapStruct 的底层原理

MapStruct的底层原理是使用Java注解处理器(Annotation Processor)来生成转换代码。注解处理器是一种在编译时扫描和处理注解的工具,它可以读取源代码中的注解信息,并根据注解信息生成新的Java代码。

当我们在映射器接口上添加@Mapper注解时,注解处理器会扫描该接口及其方法上的注解信息,并根据注解信息生成转换代码。具体流程如下:

1、扫描映射器接口:

注解处理器会扫描映射器接口上的注解信息,获取源对象和目标对象的类型、映射方法等元数据。

2、解析映射方法:

注解处理器会解析映射方法上的注解信息,包括源属性和目标属性的映射关系、转换逻辑等。

3、生成转换代码:

根据源对象和目标对象的类型以及映射方法的注解信息,注解处理器会生成转换代码,将源对象的属性值赋值给目标对象的对应属性。

4、编译器处理:

生成的转换代码会被注解处理器写入到编译器的输出流中,编译器会将这些代码编译为字节码文件。

5、使用转换代码:

在实际运行时,我们可以直接使用生成的转换代码,调用映射方法进行对象之间的转换。

通过使用注解处理器,MapStruct能够在编译时自动生成转换代码,避免了运行时的性能开销,提高了转换的效率。同时,由于是在编译时生成代码,所以生成的转换代码可以在开发阶段进行验证和调试,减少了编写手动转换代码的出错可能性。

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

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

相关文章

多功能杆在智慧农业中的应用

随着农业现代化发展&#xff0c;农业生产和管理不断运用越来越多新技术、新设施&#xff0c;以提高农业生产的综合效率、产品质量&#xff0c;降低管理经营成本。诸如数字化监测、物联网管理、5G远程控制&#xff0c;以及本次我们为大家介绍的多功能智慧杆系统。 多功能智慧杆拥…

股权激励一发布,股价飙升买别墅?

主要内容&#xff1a; 1.股权激励计划的含义 2.股权激励的公告数据 3.公告日到授予日股价变化 4.构建股权激励策略 5.策略运行结果 当谈到现代科技领域的先锋人物&#xff0c;马斯克无疑是其中的佼佼者&#xff0c;他人生经历可谓尽是高光时刻。 1981年10岁的马斯克用攒到…

每日温度(力扣)单调栈 JAVA

给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输入: temperatur…

使用VMware安装ubuntu和VMware tool

一、准备工作 提前准备好vmware的安装包还有Ubuntu的系统镜像 安装包已经放到网盘&#xff0c;链接在这篇文章中&#xff1a;https://blog.csdn.net/u014151564/article/details/132267441 二、使用步骤 1、打开虚拟机来到主页 在左侧右键选择新建虚拟机 2、向导步骤如图…

变压器故障诊断(python代码,逻辑回归/SVM/KNN三种方法同时使用,有详细中文注释)

代码运行要求&#xff1a;tensorflow版本>2.4.0,Python>3.6.0即可&#xff0c;无需修改数据路径。 1.数据集介绍&#xff1a; 采集数据的设备照片 变压器在电力系统中扮演着非常重要的角色。尽管它们是电网中最可靠的部件&#xff0c;但由于内部或外部的许多因素&#…

预告|8月16日-18日,相约DTCC 2023!星瑞格邀您共飨数据库技术盛宴

相约DTCC 2023&#xff0c;共飨数据库技术盛宴&#xff01; 2023年8月16-18日&#xff0c;第十四届中国数据库技术大会&#xff08;DTCC 2023&#xff09;将于北京国际会议中心隆重召开。福建星瑞格软件有限公司&#xff08;以下简称星瑞格&#xff09;受邀参加本届DTCC中国数…

污水处理厂人员定位方案介绍

污水处理厂人员定位在现代化的污水处理厂中具有重要的意义&#xff0c;它可以带来多方面的优势和好处&#xff1a; 安全管理&#xff1a; 污水处理厂通常涉及到各种危险环境和设备&#xff0c;如化学品、高压设备等。人员定位系统可以追踪人员的位置&#xff0c;确保他们不会进…

基于C#UI Automation自动化测试

步骤 UI Automation 只适用于&#xff0c;标准的win32和 WPF程序 需要添加对UIAutomationClient、 UIAutomationProvider、 UIAutomationTypes的引用 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.D…

arcgis数据采集与拓扑检查

1、已准备好一张配准好的浙江省行政区划图&#xff0c;如下&#xff1a; 2、现在需要绘制湖州市县级行政区划。需要右击文件夹新建文件地理数据库&#xff0c;如下&#xff1a; 其余步骤均默认即可。 创建好县级要素数据集后&#xff0c;再新建要素类&#xff0c;命名为县。 为…

Axure中文环境配置教程,让原型设计和乱码说再见!

很多产品新人刚接触原型设计时,首选的工具通常都是Axure。我们可以在官网或者其他途径下载Axure的安装包,但安装完成后会发现,这个原型工具只提供30天的试用期。如果想继续使用,就需要输入账号和密钥进行正式授权。当安装授权工作完成后,还需要进行一项重要的设置,那就是对Axur…

Airbnb开源数据可视化工具Visx

一、什么是visx visx 是用于 React 的富有表现力的底层可视化组件集合,结合了 d3 的强大功能来生成可视化,以及 React 更新 DOM 的诸多优势。 在 Airbnb 内部,visx 的目标是统一整个公司的可视化堆栈,在此过程中,创建了 visx 项目,从而有效的将 D3 的强大功能与 React …

Server - 文字转语音 (Text to Speech) 的在线服务 TTSMaker

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132287193 TTSMaker 是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括英语、法语、德语、西班…

七、Everything_本地文件搜索神器

1、Everything简介 "Everything"是Windows上一款搜索引擎&#xff0c;它能够基于文件名快速定文件和文件夹位置。不像 Windows 内置搜索&#xff0c;"Everything" 默认显示电脑上每个文件和文件夹 (就如其名 "Everything")。在搜索框输入的关键词…

[国产MCU]-BL602开发实例-LCD1602 I2C驱动

LCD1602 I2C驱动 文章目录 LCD1602 I2C驱动1、LCD1602/LCD2004介绍2、硬件准备3、驱动实现本文将详细介绍如何在K210中驱动LCD1602/LCD2004 I2C显示屏。 1、LCD1602/LCD2004介绍 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱…

Install And Understand APISIX(Master the knowledge of APISIX)

Master the knowledge of APISIX Install And Understand APISIX 环境准备 接口服务&#xff1a;gpt 接口服务&#xff08;使用 spring boot 编写的 Chat GPT 接口服务&#xff09; 调用接口示例&#xff1a; 虚拟机软件&#xff1a;VMware Workstation Pro 17 Linux 镜像&…

8.14 作业 ARM

.text .globl _gcd_gcd:mov r0,#9mov r1,#15cmp r0,r1 比较r0和r1寄存器中的值beq stopsubhi r0,r0,r1subcc r1,r1,r0stop:b stop .end用for循环实现1~100之间和&#xff1a; .text .globl _start_start:mov r0,#0 总和mov r1,#1 从1开始mov r2,#100 到100结束bl add_loopa…

docker发展历史

docker 一、docker发展历史很久以前2013年2014年2015年2016年2017年2018年2019年及未来 二、 docker概述定义&#xff1a;docker底层运行原理:docker简述核心概念容器特点Docker与虚拟机的区别: 三、容器在内核中支持两种重要技术四、namespace的六项隔离五、虚拟化产品有哪些1…

SSH隧道搭建简单使用;本地电脑局域网内网穿透外网访问

参考&#xff1a; https://www.zsythink.net/archives/2450 https://luckyfuture.top/ssh-tunnel#SSH%E9%9A%A7%E9%81%93 https://zhuanlan.zhihu.com/p/561589204?utm_id0 1、 SSH隧道&#xff08;搭建SSH隧道绕过防火墙&#xff09;&#xff1a; ssh命令除了登陆外还有代理…

判断自己网络所在的NAT类型

文章目录 各NAT类型介绍软件准备流程 各NAT类型介绍 NAT0: OpenInternet&#xff0c;没有经过NAT地址转换&#xff0c;公网IP NAT1: Full Cone NAT&#xff0c;动态家宽可以达到最优的状态&#xff0c;外网设备可以主动发信息给NAT1网络内的设备。 NAT2: Address-Restricted C…

什么是低质量无露脸直播内容?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 无人直播带货那么火&#xff0c;很多人都在做无人直播或者半无人直播的带货&#xff0c;但很多人都是从培训者的只言片语中了解的&#xff0c;少有人看官方的内容。而今天详细规范来了。新手朋友一…