MapStruct实体映射工具

news2024/9/25 23:12:30

一丶MapStruct是什么

MapStruct 是一个代码生成器,它基于配置方法的约定,极大地简化了 Java Bean 类型之间映射的实现,生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。

官方网站 MapStruct – Java bean mappings, the easy way!

二丶为什么需要MapStruct

多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写这样的映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过尽可能自动化来简化这项工作。

与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。

方案

优点

缺点

手写代码 1. 灵活性高
2. 方便后续重构
1. 重复性工作多
2. 手写代码容易遗漏掉有些字段
BeanUtils.copyProperties 1. 使用简单
2. Apache 的包效率比较低,spring 的包效率可以接受
1. 复杂场景支持不足,控制 copy 粒度太粗
2. 不易重构
MapStruct 1. 灵活性高支持简单,复杂,嵌套,自定义扩展等多种手段
2. 编译期生成,没有效率问题
1.不方便后续重构

三丶MapStruct 性能优于BeanUtils的原因

Java程序执行的过程,是由编译器先把java文件编译成class字节码文件,然后由JVM去解释执行class文件。Mapstruct正是在java文件到class这一步帮我们实现了转换方法,即做了预处理,提前编译好文件(Java动态编译),通过查看class文件,

可以看出CarMapper被打上org.mapstruct.Mapper注解后,编译器自动会帮我们生成一个实现类CarMapperImpl,并实现了carToCarDto这个方法,看下面的代码块,从生成的代码看,生成的代码只使用了CarDO get方法和CarDTO set方法,没有其他复杂逻辑。

MapStruct实现

编译后会在target文件夹下生成实现类CarMapperImpl

CarMapper代码

package com.tuhu.cas.service.convert;
 
import com.tuhu.cas.dto.CarDTO;
import com.tuhu.cas.mysql.cas.write.dataobject.CarDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
 
@Mapper
public interface CarMapper {
 
    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
 
    @Mapping(target = "manufacturer", source = "make")
    @Mapping(target = "seatCount", source = "numberOfSeats")
    CarDTO carToCarDto(CarDO car);
 
}

CarMapperImpl代码

package com.tuhu.cas.service.convert;
 
import com.tuhu.cas.dto.CarDTO;
import com.tuhu.cas.mysql.cas.write.dataobject.CarDO;
import javax.annotation.Generated;
 
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-11-22T19:44:12+0800",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_111 (Oracle Corporation)"
)
public class CarMapperImpl implements CarMapper {
 
    @Override
    public CarDTO carToCarDto(CarDO car) {
        if ( car == null ) {
            return null;
        }
 
        CarDTO carDTO = new CarDTO();
 
        carDTO.setSeatCount( car.getNumberOfSeats() );
        carDTO.setManufacturer( car.getMake() );
 
        return carDTO;
    }
}

Spring的BeanUtils.copyProperties源码

通过源码,我们可以看到有很多的遍历,去获取属性,获取方法,设置方法可访问,通过反射,所以执行效率相对Mapstruct来说,是比较低的。回头看Mapstruct自动生成的实现类,简洁、高效。

/**
 * Copy the property values of the given source bean into the given target bean.
 * <p>Note: The source and target classes do not have to match or even be derived
 * from each other, as long as the properties match. Any bean properties that the
 * source bean exposes but the target bean does not will silently be ignored.
 * @param source the source bean
 * @param target the target bean
 * @param editable the class (or interface) to restrict property setting to
 * @param ignoreProperties array of property names to ignore
 * @throws BeansException if the copying failed
 * @see BeanWrapper
 */
private static void copyProperties(Object source, Object target, @Nullable Class<?> editable,
        @Nullable String... ignoreProperties) throws BeansException {
 
    Assert.notNull(source, "Source must not be null");
    Assert.notNull(target, "Target must not be null");

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

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

相关文章

桌管系统能否查微信聊天记录?这篇文章告诉你答案

桌面管理系统&#xff08;简称“桌管系统”&#xff09;确实可以用来监控和查看员工的微信聊天记录。以“安企神”这款桌管系统为例&#xff0c;它提供了全面的功能来帮助企业管理和监控员工的上网行为及通信记录。以下是关于安企神系统如何查看微信聊天记录的一些具体信息&…

什么是行为监控?企业透明化管理新纪元!揭秘四款顶尖行为监控软件!

行为监控&#xff0c;是指通过技术手段对员工在工作场所内的行为、活动以及数据使用情况进行全面、实时的监测与分析。它不仅帮助管理者洞悉员工工作状态&#xff0c;提升团队效率&#xff0c;还能有效防止数据泄露和不当行为&#xff0c;为企业构建更加安全、有序的工作环境。…

RAG前沿技术/解决方案梳理

RAG前沿技术/解决方案梳理 BenchmarkRetrievalAdaptive-RAGDR-RAGRichRAGGenRT Critique/ReasoningSelf-RAGCorrective RAGSpeculative RAGPlanRAGSelf-ReasoningReSP MemorySelfmemHippoRAG Query RewriteRaFe SummaryRefiner 个人理解 对当前RAG的学术研究&#xff08;或者好…

加密的PDF文件怎么能够转换为word文档

Word是一种常见的文档格式&#xff0c;被广泛应用于办公室、教育等领域&#xff0c;目前它拥有较为丰富的文档编辑和格式化功能。然而&#xff0c;因为当前很多场景下&#xff0c;大多数资料文件都是以PDF格式存在&#xff0c;因为其具备比较强的稳定性&#xff0c;所以想要去修…

LearnOpenGL-光照章节学习笔记

LearnOpenGL-光照章节学习笔记 颜色创建一个光照场景 基础光照一、环境光照二、漫反射光照三、镜面反射 材质光照贴图一、漫反射贴图二、镜面光贴图三、放射光贴图 投光物一、平行光二、点光源衰减实现 三、聚光灯平滑边缘 多光源一、平行光&#xff08;定向光&#xff09;二、…

知识分享 | 详解整车区域控制器(ZCU)

随着智能网联汽车技术的迅猛发展&#xff0c;整车区域控制器ZCU&#xff08;Zone Control Unit&#xff09;作为汽车电子电气架构中的核心组件&#xff0c;其重要性日益凸显。ZCU不仅作为区域数据中心、IO中心及配电中心&#xff0c;在车辆动力、传感器管理、信息娱乐等方面发挥…

线性DP+摆渡车

线性DP&#xff1a; 具有线性“阶段”划分的动态规划算法称为线性DP。 线性DP无论状态表示是一维还是多维&#xff0c;DP算法在线性DP问题上都体现出了“作用在线性空间上的阶段划分和状态转移” &#xff0c;DP的阶段沿着各个维度线性增长。从一个或多个“初始状态”开始有方…

uni-app下Worker的使用

1、在static目录下创建一个目录用于存放worker文件 为啥要在static目录下创建worker目录呢&#xff1f;那是因为worker.js没办法在别的js中被引用&#xff0c;uni-app项目编译成微信小程序代码时会进行Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;把那些没被引用…

全方位教程:接入视频美颜SDK与直播美颜插件的完整步骤

今天&#xff0c;小编将为您详细介绍如何接入视频美颜SDK与直播美颜插件的完整步骤。 一、准备工作 开发环境的搭建 在开始集成之前&#xff0c;确保您的开发环境已配置完毕。无论是使用iOS、Android&#xff0c;还是Web开发&#xff0c;您都需要准备好对应的开发工具链&…

人工智能深度学习系列—深入探索KL散度:度量概率分布差异的关键工具

人工智能深度学习系列—深度解析&#xff1a;交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;在分类问题中的应用 人工智能深度学习系列—深入解析&#xff1a;均方误差损失&#xff08;MSE Loss&#xff09;在深度学习中的应用与实践 人工智能深度学习系列—深入探索KL…

你的报表工具选对了吗?中国式报表的正确制作方法

1. 中国式报表的困境 在许多企业中&#xff0c;“中国式报表”是一个让人头疼的存在。中国式报表通常格式复杂&#xff0c;包含大量数据和多层次的数据结构。它不仅需要展示大量的统计数据&#xff0c;还要通过交叉计算等方式呈现数据之间的关系。这种报表对数据处理能力、展示…

关于hive与hadoop初了解

hdfs分布式存数据&#xff0c;MapReduce处理数据。yarn资源管理和任务调度。 hive就是方便处理hadoop数据的 。 hive本事不处理数据&#xff0c;在hive on yarn上是 将sql转换为mapreduce程序&#xff08;不太理解&#xff0c;后续了解吧&#xff09;

数据编制全攻略:从杂乱原始数据到AI就绪数据集的转化之旅

目录 什么是数据编制?数据编制的重要性数据编制的基本流程1. 数据收集2. 数据清洗3. 数据转换4. 数据结构化5. 数据集成6. 数据验证 数据编制的最佳实践1. 制定数据标准2. 自动化流程3. 版本控制4. 数据质量监控5. 文档化6. 安全性和隐私保护 数据编制中的常见挑战及解决策略1…

日志系统——异步缓冲区

生产者——消费者模型&#xff1a; 多线程场景中最常见的模型之一&#xff0c;异步写日志时负责产生日志消息的业务线程充当生产者&#xff0c;负责写日志的线程充当消费者&#xff0c;两种角色进行数据交互需要依靠一块缓冲区。 单缓冲区的缺点 传统的单缓冲区PC模型一般是基…

【工具推荐】强大的图形化“社工密码生成器”

下载地址&#xff1a; 关注WX“光剑安全”公众号&#xff0c;发送“20240807社工”即可获得工具包&#xff01; 工具一&#xff1a;安全牛&#xff0c;java运行的一款社工密码生成器。 1、工具页面如下&#xff0c;可以根据对方信息、对方配偶信息、特殊符号进行排列组合生成…

c++的STL库stack、queue的使用

1.stack 在STL库中stack是一个模版类&#xff0c;第一个模版参数为存储的数据类型&#xff0c;第二个模版参数为实现stack的容器&#xff08;可缺省&#xff09;。 常用的成员函数如下 2.queue 如stack一样queue是一个模版类&#xff0c;第一个模版参数为存储的数据类型&#…

终于解决了ubuntu在高清屏上 chromium界面dpi低,界面模糊的问题

终于解决了ubuntu在高清屏上 chromium界面dpi低&#xff0c;界面模糊的问题 说明&#xff1a; 系统是ubuntu24.04&#xff0c;用firefox dpi正常&#xff0c;界面和文字都很细腻&#xff0c;用chrome,chromium,edge就很模糊&#xff0c;网上一大片的都是说字体问题&#xff0…

(21)Spring基础

Spring 需要导入的包 <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.26</ve…

Go 1.19.4 结构体-Day 09

1. 结构体介绍 1.1 什么是结构体 结构体&#xff08;struct&#xff09;是一种用户定义的类型&#xff0c;它由一系列的字段组成&#xff0c;每个字段都有自己的名称和类型。 结构体也是值类型的&#xff0c;就算加了指针也是&#xff0c;只不过是复制的内存地址。 1.2 为什么…

【数据结构】二叉搜索树(Java + 链表实现)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…