前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mapstruct解放Java对象转换

mapstruct解放Java对象转换

作者头像
方丈的寺院
发布于 2020-08-05 03:17:07
发布于 2020-08-05 03:17:07
2.6K00
代码可运行
举报
文章被收录于专栏:方丈的寺院方丈的寺院
运行总次数:0
代码可运行

摘要

当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换。这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手

技术方案

实现类转换的方案很多,不同方案有优缺点,需要开发者自行取舍

方案

优点

缺点

手写代码

1. 灵活性高 2.方便后续重构

1. 重复性工作多 2. 手写代码容易遗漏掉有些字段

BeanUtils.copyProperties 使用反射实现

1. 使用简单 2. Apache 的包效率比较低,spring的包效率可以接受

1. 复杂场景支持不足,控制copy粒度太粗 2. 不易重构

mapstruct

1. 灵活性高支持简单,复杂,嵌套,自定义扩展等多种手段 2. 编译期生成,没有效率问题

不方便后续重构

方便后续重构方便后续重构的意思是当你需要更改DTO字段时,可以利用编译器的引用关系直接refactor掉

综上考虑mapstruct方案优于beanutils.copy,和手写方案对比,有一定劣势,需要取舍。个人意见,对于改字段重构,这种应该通过测试用例去保证,而不是依赖编辑器的功能。此外使用mapstruct进行转换后,类引用关系还在,重构可以通过识别类的粒度,来保证不出错。如果再考虑到手工党的出错概率,和开发效率mapstruct显然更优。

实现

  1. 引入依赖包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<properties>
    <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
</properties>
...
<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${org.mapstruct.version}</version>
    </dependency>
</dependencies>
  1. 为maven compile plugin 设置annotation processor
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source> <!-- depending on your project -->
                <target>1.8</target> <!-- depending on your project -->
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${org.mapstruct.version}</version>
                    </path>
                       <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.10</version>
                    </path>
                    <!-- other annotation processors -->
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>
  1. IDEA 安装一个mapstruct 插件 有了这个插件后,可以找到映射类的属性,一些拼写校验

常用用法

默认情况下,当属性值与目标实体的名称相同时,就会隐式映射

其他通用转换

属性值不相同时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapping(target="dateEnd", source="end")
ExampleVO doToVO(ExampleDO do);

Collection对象转换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapping(target="dateEnd", source="end")
ExampleVO doToVO(ExampleDO do);

List<ExampleVO> doToVOS(List<ExampleDO> dos)

JAVA 构造器

通过expression 来调用Java代表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapping(target="dateEnd", expression="java(new java.util.Date())"
ExampleVO doToVO(ExampleDO do);

qualifiedByName

如果构造器满足不了,还可以自定义方法,然后再调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapping(target="dateEnd", qualifiedByName="format", source="end")
ExampleVO doToVO(ExampleDO do);
@Named("format")
default Date formatDate(Long date) {
xxx
}

接口默认实现

mapstruct是用户定义接口,然后自动生成实现类,如果转换类中有非常定制的转换,不想通过mapstruct来转换,我们可以直接使用接口默认实现

当然还有其他功能可以使用,比如Decorator,这里不再一一列举,更多丰富的功能可以查看mapstruct 细节使用

参考

https://blog.csdn.net/w605283073/article/details/107371462

mapstruct 细节使用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PO VO DTO 转换神器替代BeanUtils 了
在我们日常开发的程序中,为了各层之间解耦,一般会定义不同的对象用来在不同层之间传递数据,比如xxxDTO、xxxVO、xxxQO,当在不同层之间传输数据时,不可避免地经常需要将这些对象进行相互转换。
默 语
2024/11/20
1840
PO VO DTO 转换神器替代BeanUtils 了
别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/02
5650
别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?
超详细 mapstruct 简化教程
MapStruct 结合spring使用,设定componentModel = "spring"即可,如下Mapper接口:
派大星在吗
2021/12/16
2.9K0
BeanUtils被秒杀!全网疯传的MapStruct到底有多香?
大家好,我是小义,今天来讲一讲MapStruct。我们在写项目的过程中,分层式结构很常见,像表示层controller、业务逻辑层service、数据访问层dao等。
程序员小义
2024/08/05
2340
BeanUtils被秒杀!全网疯传的MapStruct到底有多香?
喜新厌旧,是我的本性。今天就宠mapstruct怎么了!
这些年写Java写多了,感觉Java是越来越丑。尤其是在玩了TypeScript之后,看到Java代码总有一股想吐的感觉。这种思想的转变,从侧面上证明了,我并不是一个专一的人。
xjjdog
2021/03/10
1.8K0
喜新厌旧,是我的本性。今天就宠mapstruct怎么了!
SpringBoot 整合mapstruct|赶紧丢掉BeanUtils吧
代码已经上传到码云:https://gitee.com/lezaiclub/springboot-hyper-integration.git,欢迎白嫖
AI码师
2022/09/19
1.7K0
SpringBoot 整合mapstruct|赶紧丢掉BeanUtils吧
是时候丢掉 BeanUtils 了!
为了更好的进行开发和维护,我们都会对程序进行分层设计,例如常见的三层,四层,每层各司其职,相互配合。也随着分层,出现了 VO,BO,PO,DTO,每层都会处理自己的数据对象,然后向上传递,这就避免不了经常要将一个对象的属性拷贝给另一个对象。
好好学java
2024/07/25
1450
是时候丢掉 BeanUtils 了!
优雅的对象转换解决方案,为什么更推荐 MapStruct 呢?
第一次看到 MapStruct 的时候, 我个人非常的开心。因为其跟我内心里面的想法不谋而合。
程序员白楠楠
2021/01/10
1.6K0
MapStruct从入门到精通:Java对象映射的终极指南
在Java开发中,对象之间的转换(如DTO转Entity、VO转BO)是常见但繁琐的任务。传统的getter/setter方式不仅繁琐且易错,而反射工具BeanUtils.copyProperties()则存在性能问题。MapStruct作为基于注解的代码生成器,提供了编译时类型安全的优雅解决方案。本文将深入解析MapStruct的核心功能与最佳实践。
Java微观世界
2025/04/22
1680
MapStruct从入门到精通:Java对象映射的终极指南
实战之mapstruct的妙用
lombok是一款插件,在常用的开发工具eclipse和idea中都很好进行安装,具体安装方式请自行网上寻找。lombok提供了一些的的注解,会在编译期帮你自动生成一些代码。
山行AI
2019/06/28
5.1K0
实战之mapstruct的妙用
mapStruct学习笔记
mapStruct是一个专门进行数据类型转化工具,与ModelMapper和BeanUtils的反射不同,这个MapStruct抛弃了动态生成的策略,反而采用了类似代理的方式,编译的时候进行动态生成,也就是说在编译的时候,就把要我们需要的get、set都已经写到了“代理类”的class文件里了。然后代码运行的时候,直接使用的是代理类。大概得过程mapstruct根据一般的规范定义一套解析规则,然后开发人员按规则去写,然后编译的时候,mapstruct按这个规则生成一个类,这个类里包含了实体转化的各种set、get方法。
写一点笔记
2020/08/25
1.9K0
mapStruct学习笔记
lombok插件失效原因_lombok插件下载
昨晚项目出了个小问题,lombok插件失效了。 由于使用了lombok的@Data注解生成实体类的getter和setter,项目运行时所有的使用getter和setter方法的地方全都报错。
全栈程序员站长
2022/10/03
1.4K0
Java类型转换用了MapStruct确实爽,但这个坑一不小心就栽进去了
除了常见的source,target,expression这几个,可以用调试来检查是否转换成功。
大风写全栈
2024/11/26
3450
Java类型转换用了MapStruct确实爽,但这个坑一不小心就栽进去了
你还在用 BeanUtils?试试 MapStruct,优雅的对象转换解决方案!
对于代码中 JavaBean之间的转换, 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化, 非常的影响观感,却又不得不存在。我后来想的一个办法就是通过反射,或者自己写很多的转换器。
java进阶架构师
2023/09/04
6230
你还在用 BeanUtils?试试 MapStruct,优雅的对象转换解决方案!
mapstruct
首先按照官方文档引入GAV,但要注意和lombok有版本冲突问题,因此我选择这个版本:
阿超
2022/08/21
1K0
mapstruct
业务代码的救星——Java 对象转换框架 MapStruct 妙用
在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domainobject,将 domainobject 转为数据持久层的 dataobject,将 domainobject 转换为 DTO 以便返回给外部调用方等。在转换时大部分属性都是相同的,只有少部分的不同,如果手工编写转换代码,会很繁琐。这时我们可以通过一些对象转换框架来更方便的做这件事情。
周三不加班
2019/09/08
2.1K0
芋道 Spring Boot 对象转换 MapStruct 入门
为了让应用的代码更易维护,我们往往会将项目进行分层。在《阿里巴巴 Java 开发手册》中,推荐分层如下图:
芋道源码
2020/05/19
2.8K0
芋道 Spring Boot 对象转换 MapStruct 入门
一款 PO VO DTO 转换神器,求求你别在到处找工具类了!
老铁们是不是经常为写一些实体转换的原始代码感到头疼,尤其是实体字段特别多的时候。介绍一个开源项目 mapstruct ,可以轻松优雅的进行转换,简化你的代码。当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思路。
肉眼品世界
2020/11/17
9570
一款 PO VO DTO 转换神器,求求你别在到处找工具类了!
mapstruct的spring拓展
https://mapstruct.org/documentation/spring-extensions/reference/html/
阿超
2022/08/21
9620
mapstruct的spring拓展
第三十章:SpringBoot使用MapStruct自动映射DTO
MapStruct是一种类型安全的bean映射类生成java注释处理器。 我们要做的就是定义一个映射器接口,声明任何必需的映射方法。在编译的过程中,MapStruct会生成此接口的实现。该实现使用纯java方法调用的源和目标对象之间的映射,MapStruct节省了时间,通过生成代码完成繁琐和容易出错的代码逻辑。下面我们来揭开它的神秘面纱 本章目标 基于SpringBoot平台完成MapStruct映射框架的集成。 SpringBoot 企业级核心技术学习专题 专题 专题名称 专题描述 001 Spring
恒宇少年
2018/06/27
5.5K0
推荐阅读
相关推荐
PO VO DTO 转换神器替代BeanUtils 了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验