MapStruct工具类的使用

文章目录

  • 1.简介
  • 2.作用
    • 2.1 属性拷贝
    • 2.2 类型安全
    • 2.3 性能高效
    • 2.4 自定义转换
  • 3.如何使用
    • 3.1 创建一个maven工程项目并引入mapstruct的坐标依赖:
    • 3.2 源对象类
    • 3.3 目标对象类(和源对象类中的字段属性名相同)
    • 3.4 创建接口SyncMapper(接口名自定义)
    • 3.5 执行
    • 3.6 改动目标对象类属性(和源对象类中的字段属性名不相同)

1.简介

MapStruct是一个代码生成器,它基于约定优于配置的原则,通过注解的方式,将Java bean对象之间进行属性拷贝。它避免了手动编写繁琐的getter/setter调用代码,大大提高了开发效率,并且生成的代码类型安全、性能高效。

2.作用

2.1 属性拷贝

MapStruct主要用于Java bean之间的属性拷贝。例如,您有一个用户信息的DTO(数据传输对象)和一个用户信息的实体类,这两个类之间有很多相同的属性。使用MapStruct,您可以定义一个Mapper接口,并通过注解指定源对象和目标对象,MapStruct会自动生成实现这个Mapper接口的代码,完成属性拷贝的工作。

2.2 类型安全

由于MapStruct是基于注解和代码生成的,它可以在编译时期就检查类型安全。如果源对象和目标对象的属性类型不匹配,编译将会失败,这有助于及早发现问题。

2.3 性能高效

MapStruct生成的代码是直接调用getter和setter方法,而不是使用反射,因此性能非常高效。这使得它非常适合在高并发、高性能要求的场景中使用。

2.4 自定义转换

MapStruct还支持自定义转换逻辑。如果您需要对某个属性的拷贝进行特殊处理,比如日期格式的转换,您可以通过实现自定义的转换方法,并在Mapper接口中指定使用这个方法进行转换。

3.如何使用

3.1 创建一个maven工程项目并引入mapstruct的坐标依赖:

<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.5.2.Final</version> <!-- 请使用最新版本 -->
</dependency>
<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.2.Final</version> <!-- 请使用最新版本 --><scope>provided</scope>
</dependency>

3.2 源对象类

/*** @ClassName JyFullOnlineTimeDO* @Description TODO* @Author xiaoxiao* @Date 2025/1/24*/
public class JyFullOnlineTimeDO {private String reservedFieldOne;private String reservedFieldTwo;private String reservedFieldThree;// create getter and setter methodspublic String getReservedFieldOne() {return reservedFieldOne;}public void setReservedFieldOne(String reservedFieldOne) {this.reservedFieldOne = reservedFieldOne;}public String getReservedFieldTwo() {return reservedFieldTwo;}public void setReservedFieldTwo(String reservedFieldTwo) {this.reservedFieldTwo = reservedFieldTwo;}public String getReservedFieldThree() {return reservedFieldThree;}public void setReservedFieldThree(String reservedFieldThree) {this.reservedFieldThree = reservedFieldThree;}}

3.3 目标对象类(和源对象类中的字段属性名相同)

/*** @ClassName CompanyOnlineSyncVO* @Description TODO* @Author xiaoxiao* @Date 2025/1/24*/
public class CompanyOnlineSyncVO {private String reservedFieldOne;private String reservedFieldTwo;private String reservedFieldThree;//生成以上字段的getter和setter方法public String getReservedFieldOne() {return reservedFieldOne;}public void setReservedFieldOne(String reservedFieldOne) {this.reservedFieldOne = reservedFieldOne;}public String getReservedFieldTwo() {return reservedFieldTwo;}public void setReservedFieldTwo(String reservedFieldTwo) {this.reservedFieldTwo = reservedFieldTwo;}public String getReservedFieldThree() {return reservedFieldThree;}public void setReservedFieldThree(String reservedFieldThree) {this.reservedFieldThree = reservedFieldThree;}
}
@Override
public String toString() {return "CompanyOnlineSyncVO{" +"reservedFieldOne='" + reservedFieldOne + '\'' +", reservedFieldTwo='" + reservedFieldTwo + '\'' +", reservedFieldThree='" + reservedFieldThree + '\'' +'}';
}

3.4 创建接口SyncMapper(接口名自定义)

import org.mapstruct.Mapper;
import java.util.List;/*** @ClassName SyncMapper* @Description TODO* @Author xiaoxiao* @Date 2025/1/24*/
@Mapper
public interface SyncMapper {SyncMapper INSTANCE = Mappers.getMapper(SyncMapper.class);CompanyOnlineSyncVO toVO(JyFullOnlineTimeDO jyFullOnlineTimeDO);List<CompanyOnlineSyncVO> toVOList(List<JyFullOnlineTimeDO> doList);
}

SyncMapper 接口中定义了两个方法,其中一个方法将JyFullOnlineTimeDO对象转换为CompanyOnlineSyncVO对象,另一个方法是将JyFullOnlineTimeDO对象集合转换为CompanyOnlineSyncVO对象集合。

3.5 执行

对象间转换演示:

public class Main {public static void main(String[] args) {// 创建JyFullOnlineTimeDO对象列表JyFullOnlineTimeDO do1 = new JyFullOnlineTimeDO();do1.setReservedFieldOne("Value1");do1.setReservedFieldTwo("Value2");do1.setReservedFieldThree("Value3");final CompanyOnlineSyncVO aDo = SyncMapper.INSTANCE.toVO(do1);System.out.println("aDo: " + aDo.toString());
}

输出:aDo: CompanyOnlineSyncVO{reservedFieldOne=‘Value1’, reservedFieldTwo=‘Value2’, reservedFieldThree=‘Value3’}

在执行main的时,程序编译过程中会生成一个SyncMapper接口的实现类SyncMapperImpl(此类是在target下,故无需自己编辑)
在这里插入图片描述
集合间转换演示:

public class Main {public static void main(String[] args) {// 创建JyFullOnlineTimeDO对象列表JyFullOnlineTimeDO do1 = new JyFullOnlineTimeDO();do1.setReservedFieldOne("Value1-1");do1.setReservedFieldTwo("Value1-2");do1.setReservedFieldThree("Value1-3");JyFullOnlineTimeDO do2 = new JyFullOnlineTimeDO();do2.setReservedFieldOne("Value2-1");do2.setReservedFieldTwo("Value2-2");do2.setReservedFieldThree("Value2-3");List<JyFullOnlineTimeDO> doList = Arrays.asList(do1, do2);// 执行映射操作List<CompanyOnlineSyncVO> voList = SyncMapper.INSTANCE.toVOList(doList);// 输出结果for (CompanyOnlineSyncVO vo : voList) {System.out.println("vo: " + vo.toString());}}
}

输出:
vo: CompanyOnlineSyncVO{reservedFieldOne=‘Value1-1’, reservedFieldTwo=‘Value1-2’, reservedFieldThree=‘Value1-3’}
vo: CompanyOnlineSyncVO{reservedFieldOne=‘Value2-1’, reservedFieldTwo=‘Value2-2’, reservedFieldThree=‘Value2-3’}
在这里插入图片描述
toVOList方法在编译过程中自动生成的实现类中,在内部实现上利用了之前的toVO方法。

下面演示:目标对象类和源对象类中的字段属性名不相同时

3.6 改动目标对象类属性(和源对象类中的字段属性名不相同)

public class CompanyOnlineSyncVO {private String zbyzd1;private String zbyzd2;private String zbyzd3;//create getter 和 setter 方法public String getZbyzd1() {return zbyzd1;}public void setZbyzd1(String zbyzd1) {this.zbyzd1 = zbyzd1;}public String getZbyzd2() {return zbyzd2;}public void setZbyzd2(String zbyzd2) {this.zbyzd2 = zbyzd2;}public String getZbyzd3() {return zbyzd3;}public void setZbyzd3(String zbyzd3) {this.zbyzd3 = zbyzd3;}@Overridepublic String toString() {return "CompanyOnlineSyncVO{" +"zbyzd1='" + zbyzd1 + '\'' +", zbyzd2='" + zbyzd2 + '\'' +", zbyzd3='" + zbyzd3 + '\'' +'}';}
}

此时想要实现转换,需要手动指定字段间的映射关系

@Mapper
public interface SyncMapper {SyncMapper INSTANCE = Mappers.getMapper(SyncMapper.class);//@Mapping(source = "reservedFieldTwo", target = "zbyzd2") //如何只有一个字段需要手动指定时使用//当需要多个字段需要手动指定映射关系时,需要使用@Mappings进行包裹@Mappings({@Mapping(source = "reservedFieldOne", target = "zbyzd1"),@Mapping(source = "reservedFieldTwo", target = "zbyzd2"),@Mapping(source = "reservedFieldThree", target = "zbyzd3")})CompanyOnlineSyncVO toVO(JyFullOnlineTimeDO jyFullOnlineTimeDO);//不要把字段的映射关系注解放到集合上的方法上,不会起作用,放到toVO方法就行,因为其内部实现也是调用toVO,首先保证存在自己定义的单个对象间的转换的toVO方法。/*@Mappings({@Mapping(source = "reservedFieldOne", target = "zbyzd1"),@Mapping(source = "reservedFieldTwo", target = "zbyzd2"),@Mapping(source = "reservedFieldThree", target = "zbyzd3")})*/List<CompanyOnlineSyncVO> toVOList(List<JyFullOnlineTimeDO> doList);//当需要转换的集合对象间的属性不一致时,手动写出单个对象间转换的toVO方法,并在toVO方法上使用@Mappings{.....}或@Mapping(...)是必要的,否则实现不了集合对象间的属性不一致时的,集合间的转换。
}

此时编译后,生成的SyncMapperImpl实现类内容如下:
在这里插入图片描述
在这里插入图片描述
从而实现了,不同字段名时的一一对应的拷贝;
Mapping注解里,还有其他的属性:如时间格式转换等;可将源对象中的Date类型字段 转为指定时间格式的字符串后拷贝给目标对象中的字符串类型的字段
在这里插入图片描述

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

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

相关文章

FPGA| 使用Quartus II报错Top-level design entity ““ is undefined

1、使用FPGA准备点亮LED测试下板子&#xff0c;发现这个报错Error (12007): Top-level design entity "LEDLED" is undefined 工程如上图 报错如下图 2、分析到原因是因为工程名称和顶层模块里面的module名称不一样导致 解决办法&#xff1a;修改module名称和顶层模…

Window获取界面空闲时间

‌GetLastInputInfo‌是一种Windows API函数&#xff0c;用于获取上次输入操作的时间。 该函数通过LASTINPUTINFO结构返回最后一次输入事件的时间。 原型如下 BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii);那么可以利用GetLastInputInfo来得到界面没有操作的时长 uint…

LeetCode - #198 打家劫舍

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

验证工具:SVN版本控制

1-SVN概念 SVN(Subversion)是一种集中式版本控制系统,它用于文件和目录的版本管理,允许多个用户协同工作,同时追踪每个文件和目录的历史修改记录。以下是关于SVN版本控制的详细介绍: 一、SVN的基本概念 仓库(Repository):SVN的仓库是一个集中存储所有文件和目录的地…

【DeepSeek】本地私有化部署 DeepSeek 模型教程

一、引言 DeepSeek 模型是一种强大的语言模型&#xff0c;本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型&#xff0c;避免数据传输到外部带来的安全风险&#xff0c;同时也能根据自身需求进行定制化配置。本教程将详细介绍如何在本地进行 DeepSeek 模型的私有…

【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证1 契约测试的概念2 契约测试的工作原理3 契约测试的分类4 DeepSeek 给出的契约测试相关背景5 契约测试在 Postman 中的创建方法6 API 实例的基本用法7 API 实例的类型实…

为什么“记住密码”适合持久化?

✅ 特性 1&#xff1a;应用重启后仍需生效 记住密码的本质是长期存储用户的登录凭证&#xff08;如用户名、密码、JWT Token&#xff09;&#xff0c;即使用户关闭应用、重启设备&#xff0c;仍然可以自动登录。持久化存储方案&#xff1a; React Native 推荐使用 AsyncStorag…

echarts、canvas这种渲染耗时的工作能不能放在webworker中做?

可以将 ECharts、Canvas 等渲染耗时的工作放在 Web Worker 中进行处理。Web Worker 允许在后台线程中运行 JavaScript&#xff0c;从而将计算密集型任务从主线程中分离出来&#xff0c;避免阻塞用户界面。以下是一些关键点&#xff1a; 优势 性能提升&#xff1a;将耗时的渲染…

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师&#xff0c;我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机&#xff1a; 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面&#xff1a;简化调用复杂性2. 系统层面&#xff1a;屏蔽客户端调用差异3. 其他方面&#xff1a; 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1&#xff1a;同步阻塞处理2. Zuul2&#xff1a;异步非阻塞处理 三…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章&#xff0c;计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…

20250205——Windows系统基于ollama的DeepSeek-R1本地安装

1、安装ollama 1.1 Windows系统 打开ollama官网链接Download Ollama on Windows&#xff0c;根据自己的系统下载安装包&#xff0c;如果是Windows系统&#xff0c;下载Windows版本。 1.1 Linux系统 &#xff08;这个是因为运行遇到报错了&#xff0c;想自己记录一下解决方法&a…

VSCode中使用EmmyLua插件对Unity的tolua断点调试

一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示&#xff1a; 三.启动调试模式&#xff0c;并选择附加的进程

java-关键字(final,static)

关键字 final 和 static 是两个常用的关键字&#xff0c;它们分别用于不同的场景&#xff0c;具有不同的作用。 final final 关键字用于表示某个实体是不可变的。它可以应用于变量、方法和类。 final 变量 当 final 用于变量时&#xff0c;表示该变量一旦被初始化后&#…

pytorch基于FastText实现词嵌入

FastText 是 Facebook AI Research 提出的 改进版 Word2Vec&#xff0c;可以&#xff1a; ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码&#xff08;基于中文语料&#xff09;&#xff0c;包含&#xff1…

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件&#xff0c;专注于业务逻辑的快速构建与实现&#xff0c;它扮演着程序配置与执行的核心角色&#xff0c;适用于多样化的应用场景。该逻辑引擎设计灵活&#xff0c;能够通过多种配置方式被触发&#xff0c;以精准响应各类业务需求并实现…

文字加持:让 OpenCV 轻松在图像中插上文字

前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…

2024年12月 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;四级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共10题&#xff0c;共30分) 第 1 题 列表存放全班同学的身高&#xff0c;小猫运行下列程序&#xff0c;下列选项说法正确的是&#xff1f;&#xff08; &#…

基于springboot的在线BLOG博客网

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

trinitycore服务器离线,原来是mysql里数据库flag设置为2离线状态了

先上结论&#xff1a; 登录trinitycore服务器的时候&#xff0c;显示服务器离线&#xff0c;原来是mysql里数据库flag设置为2离线状态了。修改flag的值为0&#xff0c;服务器就在线了&#xff0c;问题解决。 问题&#xff1a; 登录trinitycore服务器的时候&#xff0c;显示服…