java类映射转换框架MapStrcut

Java实体映射工具:MapStruct 当我们需要进行Java Model之间的拷贝时,或者项目要求Java Model需要严格区分为数据对象(DO)、数据传输对象(DTO)和展示对象(VO)的时候,我们就不得不把一个实体中的属性映射到另一个实体中。最简单的做法就是写一个工具类,进行不断的getter / setter,这样虽然能完成要求但却写了很多冗余代码,维护起来相当恶心。所以这个时候就需要一款能自动映射实体属性的工具了。 Spring自带的BeanUtils工具类算是一款,但是它却不能自定义映射规则;ModelMapper也是一款映射工具 阅读详情

类之间转换框架 mapStruct

maven 中引用 jar

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

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
    <version>${org.mapstruct.version}</version>
</dependency>

配置 maven-compiler-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <source>${java.version}</source> <!-- or higher, depending on your project -->
        <target>${java.version}</target> <!-- or higher, depending on your project -->
        <annotationProcessorPaths>
            <!-- 如果使用lombok, 需要将lombok放在 mapstruct之前 -->
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${org.projectlombok.version}</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${org.mapstruct.version}</version>
            </path>
        </annotationProcessorPaths>
        <compilerArgs>
            <!-- 不生成impl生成的时间 -->
            <arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
            <!-- 生成的impl类将带有 @Component spring注解 -->
            <arg>-Amapstruct.defaultComponentModel=spring</arg>
        </compilerArgs>
    </configuration>
</plugin>

使用

编写需要转换的类

转换 CustomerDo -> CustomerDto -> CustomerVo

@Data
@AllArgsConstructor
public class CustomerDo {
    private String firstName;
    private String lastName;
}
@Data
public class CustomerDto {
    private String forename;
    private String surname;
}
@Data
public class CustomerVo {
    private String firstName;
    private String lastName;
}

编写转换 Mapper (非Mybatis中的Mapper)

@org.mapstruct.Mapper
public interface CustomerMapper {

    /** 其实就是 CustomerMapper 实例对象 */
    CustomerMapper INSTANCE = Mappers.getMapper(CustomerMapper.class);

    /**
     * CustomerDo 转换成 CustomerDto
     *
     * \@org.mapstruct.Mapping
     * source: 源类的属性
     * target: 目标类的属性
     * 如果两个类中的属性名不相同, 则需要进行 source -> target 进行映射;
     * 如果两个类属性名完全相同, 则无需添加 \@org.mapstruct.Mapping, MapStruct 自动相同名称进行映射
     *
     * @param customerDo 源数据
     * @return 转换之后数据
     */
    @Mapping(source = "firstName", target = "forename")
    @Mapping(source = "lastName", target = "surname")
    CustomerDto customerToDto(CustomerDo customerDo);

    /** CustomerDto 转换成 CustomerVo */
    @Mapping(source = "forename", target = "firstName")
    @Mapping(source = "surname", target = "lastName")
    CustomerVo customerToVo(CustomerDto dto);

}

编译结果

执行 mvn clean compile -Dmaven.test.skip=true, 结果如下:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    comments = "version: 1.4.2.Final, compiler: javac, environment: Java 1.8.0_271 (Oracle Corporation)"
)
// <arg>-Amapstruct.defaultComponentModel=spring</arg> 作用的结果, 如果不想用spring, 可以去掉
@Component
public class CustomerMapperImpl implements CustomerMapper {

    @Override
    public CustomerDto customerToDto(CustomerDo customerDo) {
        if ( customerDo == null ) {
            return null;
        }

        CustomerDto customerDto = new CustomerDto();

        customerDto.setForename( customerDo.getFirstName() );
        customerDto.setSurname( customerDo.getLastName() );

        return customerDto;
    }

    @Override
    public CustomerVo customerToVo(CustomerDto dto) {
        if ( dto == null ) {
            return null;
        }

        CustomerVo customerVo = new CustomerVo();

        customerVo.setFirstName( dto.getForename() );
        customerVo.setLastName( dto.getSurname() );

        return customerVo;
    }
}

测试

/**
 * @author Chris
 * @version 1.0.0
 * @date 2021/02/02
 */
class CustomerMapperTest {
    @Test
    public void test1() {
        System.out.println("===== test1 =====");
        CustomerDo customerDo = new CustomerDo("Jacky", "Brown");
        final CustomerDto customerDto = CustomerMapper.INSTANCE.customerToDto(customerDo);
        System.out.println(customerDto);

        final CustomerVo customerVo = CustomerMapper.INSTANCE.customerToVo(customerDto);
        System.out.println(customerVo);
    }
}

结果正常, 测试结束.

因为 MapStrcut 编译时生成的类中直接使用get/set做转换处理的.所以理论上性能应该是所有映射框架中最好的. 其他映射框架如 orika,beanutils. 如果做类之间转换, 推荐使用 MapStruct 及 orika

Spring Boot 2 实战:集成 MapStruct 类型转换神器 1. 痛点 一种框架的出现都要解决个痛点,我想下面这这种不方便的操作经常有人写吧。 假如Car类是数据库映射类: ​​ package cn.felord.mapstruct.entity; import lombok.Data; /** * Car **/ @Data public class Car { private String make; private int numberOfSeats; private CarType type; } . 阅读详情

相关推荐

Mapstruct使用教程和说明

MapStruct是一个代码生成器,它大大简化了Java bean类型之间映射的实现。他生成的映射代码使用纯方法调用,因此快速,类型安全且高效。

从零开始的程序员之路 2874

Java实体映射工具MapStruct

1 项目中关于Entity、VO、DTO的认识和应用 1、entity 里的每一个字段,与数据库相对应, 2、vo 里的每一个字段,是和你前台 html 页面相对应, 3、dto 这是用来转换从 entity 到 vo,或者从 vo 到 entity 的中间的东西 。(DTO中拥有的字段应该是entity中或者是vo中的一个子集) 举个例子: 你的html页面上有三个字段,name,pass,age 你的数据库表里,有两个字段,name,pass , 注意没有 age。 而你的 vo 里,就应该有下面三个成

赵广陆 1033

MapStruct教程-三种方式处理继承关系

Mapper@Mapper在这里,我们分别定义了所有子类的映射器,并在基类映射器通过uses配置使用它们。@Overrideelse {可以看到,MapStruct自动实现了实例检查,通过instanceof判断类型。

wjianwei666的专栏 465

数据表和简单Java类映射转换

数据表和简单Java类的映射转换(阿里云开发者社区学习笔记)

m0_59803718的博客 520

Cadence AMS数模混合仿真:从零搭建高效验证环境的实战指南

本文是Cadence AMS数模混合仿真的实战指南,详细介绍了如何从零搭建高效的芯片验证环境。内容涵盖环境准备、Testbench创建、核心Config视图与ADE设置、仿真运行调试及性能加速技巧,旨在帮助工程师解决SoC设计中数字与模拟模块的集成验证难题,确保芯片设计一次成功。

weixin_29164091的博客 323

百度API实现人流量数量检测(动态)

百度的这个API还挺好用的,对与不追求高精度的人来说非常适用,结合他官方给的文档,极易上手。 需要做的就是通过API Key和Secret Key获取的access_token。 然后稍微修改下代码就行,但是他给的代码并没有直接从摄像头获取视频,而是读取一个文件夹,那么就需要自己先对摄像头的输出视频进行处理。 识别结果如下,"person_num"是当前画面的人数,in是累计进入的人数,out是累计走出去的人数。 他这个有个缺点就是返回值里边并没有实时返回in和out的值,而是都是0,但是这个图片上有,图片

qq_42479987的博客 3380

Java 对象属性映射转换器 mapStruct ,PO转VO或VO转DTO等

在项目中,时常有DTO、VO、BO等转换问题时候,我们会使用Apache或者Spring的BeanUtils来做copy。他们使用的原理都是反射,而且是浅拷贝性能不高。 场景 耗时(调用100万次) 原理 get/set 20ms 直接调用 MapStruct 20ms 接口映射注入(简洁方便) BeanCopiers 20ms 基于 cglib,修改字节码 BeanUtils 12000ms 反射 PropertyUtils 4000ms 反射 MapStruct 性能

小鹏子的博客 2607

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

Java对象到对象映射器

我在该项目上使用了Dozer一段时间。 但是,最近我遇到了一个非常有趣的错误,它促使我环顾四周,并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表: 推土机:推土机是Java Bean到Java Bean的映射器,可将数据从一个对象递归地复制到另一个对象。 通常,这些Java Bean将具有不同的复杂类型。 Orika: Orika是Java Bean映射框架,它(除...

最佳 Java 编程 1295

libopus 实现pcm 编码到opus

opus 是一种音频格式,常用于语音通话、视频会议中。最近做了个pcm 到opus 的编码,踩了不少坑,特此记录一下。

sinat_27720649的博客 9476

【Lua面试】2021年Lua面试题分享(4.25更新)

lua深拷贝和浅拷贝的区别?如何实现深拷贝? lua中ipairs和pairs的区别? 链接: link.

qq_21407523的博客 2万+

MapStruct:将数据从一个bean传输到另一个bean

将数据从一种形式转换为另一种形式在IT行业中是一种被高度利用的概念。 MapStruct通过在编译时生成映射器实现,允许基于注释的Bean转换。 这样可以确保在运行时没有性能开销。 什么是MapStruct? MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java Bean类型之间的映射的实现。 生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解...

最佳 Java 编程 1688

GOM Correlate拉伸试验后处理操作

本文描述了使用GOM Software 2022对拉伸试样进行后处理的操作,包括设置检测点、引伸计、输出应变数据到表格、输出报告为视频等

qq_45008924的博客 4665

mapstruct详解

文章目录功能介绍mapStruct是什么mapStruct有哪些功能整合到spring中基本使用引入示例基础映射多个对象转换为1个对象自定义转换器mapper使用方式建议按以下方式使用更多控制问题总结注解说明精细控制参考 功能介绍 mapStruct是什么 MapStruct是基于JSR 269的Java注解处理器,因此可以在命令行构建中使用(javac、Ant、Maven等等),可以在IDE内使用。用于生成类型安全的bean映射类的Java注解处理器。属于编译时注解,如果转换bean内容有变化。需要手动

demon7552003的小本本 2057

Calibre 3Dstack Flow Example(5-2)

本文详细介绍了Calibre3DSTACK工具在3D-IC设计验证中的应用。主要内容包括:1)连通性检查(LVS)规则编写,重点说明connected命令的使用方法和多文本标签处理;2)设计规则检查(DRC)实现,涵盖层间距检查和焊盘重叠检查;3)系统网表生成器操作流程,从芯片导入到网连通性定义;4)两种规则文件语法(扩展语法和传统语法)的编写示例;5)验证报告文件格式解析。通过具体案例演示了如何建立完整的3D-IC验证流程,包括芯片定义、装配操作、电气连接验证和物理规则检查等关键步骤,为3D-IC设计验证

u013620135的博客 2337

概念解析 | 事件相机的原理 (含仿真代码)

在我们熟悉的世界里,传统相机就像一个勤勉的绘画师,每隔固定的时间就为我们勾勒出一幅完整的画面。但是,大自然中有太多瞬息万变的精彩场景,这种"定时绘画"的方式往往难以捕捉。于是,一种全新的"观察者"应运而生 -事件相机(Event Camera)。事件相机,就像是一群极其敏感的"像素哨兵",它们不再按部就班地等待指令,而是主动感知周围的变化,只有在光线强度发生显著变化时才会发出信号。这种革命性的设计,让事件相机拥有了传统相机难以企及的优势:超高的时间分辨率、极低的延迟、宽广的动态范围,以及出色的能效比。

NLOS的博客 1422

MapStruct:高性能对象映射工具深度解析与实践指南​

MapStruct:高性能对象映射工具的原理 和 使用方式

qq_1149513559的博客 646

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lombok、mapstruct同时使用时;pojo类get、set方法生成失败,mapstruct的实现类生成失败,只是单纯的new一个新对象。

lombok、mapstruct同时使用时;pojo类get、set方法生成失败,mapstruct的实现类生成失败,只是单纯的new一个新对象。

ws78788787的博客 1517

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

mapstruct与lombok兼容的解决方案

因为现在开发对象复制必不可少,懒得写set,get方法复制,所以推荐mapstruct,具体用法可百度,这篇主要是解决mapstruct与lombook冲突的问题,话不多说,上代码 父层pom引入 <!--Java 实体映射工具 MapStruct--> <org.mapstruct.version>1.4.1.Final</org.mapstruct.version> <dependency> .

qq_40203590的博客 1686

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java MapStruct 字段映射工具类

使用注解@Mapper定义一个Converter接口,在其中定义一个do2dto方法,方法的入参类型是PersonDO,出参类型是PersonDTO,这个方法就用于将PersonDO转成PersonDTO。@Mapper在转换映射过程中,给一些属性定义一个固定的值,这个时候可以使用 constant。

lvyuanj的专栏 1919

MapStruct:简化Java对象映射的利器

在Java开发中,经常需要将一个对象的属性映射到另一个对象中,尤其是在处理数据传输对象(DTOs)、领域模型(Domain Models)和视图模型(View Models)之间的转换时。MapStruct是一个功能强大的Java对象映射框架,它可以帮助我们自动化生成映射代码,提高开发效率。除了基本的映射功能外,MapStruct还支持许多高级特性,如自定义映射方法、条件映射、嵌套映射、集合映射等。接下来,定义一个映射接口,并使用MapStruct提供的注解来描述映射规则。注解指定嵌套属性的映射规则即可。

让每一行代码都有改变世界的力量 2087

java迁移框架_【已转移】【Java架构:系统架构理论】一篇文章搞掂:RESTful

一、定义1、起源来源:Roy Fielding的博士论文。目的:理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。定义:一种实现软件通信的架构风格、设计风格,而不是标准;提供了一组设计原则和约束条件。用处:提供一种架构风格,目前也有很多相关实现,我们可以理解这种风格,借助这些实现来实现一个良好通信软件架构。2、定义REST的名称解释:SOAP:简单对象访问协议(英...

weixin_35757531的博客 220

lombok java: 找不到符号

lombok java: 找不到符号

asp.net爱好 608

开发中,用MapStract遇到问题的解决方案

例如:下面需要integralDetailPo的 integralNumber , operationIntegralActivityType两个字段进行处理,最终映射 integralNumber。1、使用注解@Mapper(componentModel = "spring"),将Convert注册成为bean。2、需要处理源多个字段,最终结果映射目标单个字段。3、源字段需要转换成目标字段。

qq_41275474的博客 594

java localdate 比较大小_Java常用开发库 MapStruct工具库详解

MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题。区别于BeanUtils这种通过反射,它通过编译器编译生成常规方法,将可以很大程度上提升效率。@pdai为什么会引入MapStruct这类工具首先看下这类工具出现的背景。@pdaiJavaBean 问题引入在开发的时候经常会有业务代码之间有很多的 Ja...

weixin_39545269的博客 431

万字知识篇(3):万字详解MapStruct

通过本文,你将学习到 MapStruct 的核心知识与实用技巧。文章从 MapStruct 的基本信息入手,对比其与 BeanUtils 的优劣,带你初识 MapStruct 的魅力。接着,详细介绍 MapStruct 的基本原理及简单使用,涵盖导入依赖、创建转换接口、使用静态实例和调用映射方法等内容。重点讲解 @Mapping 注解的多种属性,包括基本属性、忽略属性、动态拼接、默认值、固定值、时间转换及自定义转换等,帮助你灵活配置映射规则。最后,探讨 MapStruct 的高级映射功能,如集合映射

jialuosi的博客 6774
上一篇: 从Nginx源码出发-隐藏响应头的Server版本号等信息
下一篇: 利用 LinkedBlockingQueue 实现一个阻塞限制队列 LimitQueue
who7708
博客等级 码龄16年 8粉丝 35原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值