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

mapstruct解放Java对象转换

作者头像
方丈的寺院
发布于 2020-08-05 03:17:07
发布于 2020-08-05 03:17:07
2.5K00
代码可运行
举报
文章被收录于专栏:方丈的寺院方丈的寺院
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
各个版本Microsoft Visual C++运行库下载
Microsoft Visual C++ 2005 Redistributable Package (x86) http://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.exe Microsoft Visual C++ 2005 Redistributable Package (x64) http://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.exe
全栈程序员站长
2022/09/09
3.9K0
Visual Studio中/MD /MDd /MT /MTd的含义以及_ITERATOR_DEBUG_LEVEL错误的解决方法
先上结论,如果你遇到了_ITERATOR_DEBUG_LEVEL doesnt match error,那一定是你链接的库的DEBUG或RELEASE版本与你当前的项目活动配置不符。不同的值代表的含义如下:
灰度五十
2022/03/08
1.9K0
lnk2001 lnk1120_lnk1120
学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
全栈程序员站长
2022/11/08
1.1K0
浅谈 Qt 静态编译
本文要讲解的是Qt 静态编译,Qt中默认的应该是动态编译,那么本文就浅淡的介绍一下静态编译,先来看内容。
用户3519280
2023/07/06
1.2K0
常用运行库(VC++、DirectX)必备运行库
作用:提供多媒体(尤其是游戏)所需的图形、音频、输入 API 支持。 最新版本:DirectX 12(Windows 10/11 内置),但许多游戏仍依赖 DirectX 9.0c 组件。
西里网
2025/04/15
3.9K0
bjam 参数
注意,–build-type=complete表示生成debug release static shared的各种版本
用户3519280
2023/07/08
2580
如何在vs中链接vc6的运行时库
是这样,vc6的运行时库有个巨大的好处,就是全系列windows都自带了,而且不用管傻逼的manifest问题。
龙泉寺扫地僧
2019/02/20
1.8K0
运行时库
运行时库一般以dll形式存在,在程序启动的时候调用。如MFC的运行时库:MFC71.dll、MSVCR71.dll等。VS中可以通过配置环境变量是程序自动定位运行库的所在位置。
sofu456
2019/07/09
6710
运行时库
瓜哥教你上手就赢,VFP专属FLL开发入门
Visual FoxPro 动态连接库(FLL)实际上是包含对 VFP API 调用的DLL。可以使用C或者C++编写,目前MS VC系列开发工具,都是同时支持C和C++语法的,而FLL的接口只支持C语法,所以开发时接口部分需要遵循C约定,而具体实现代码则不分C或者C++,本文是写给希望使用VC开发VFP扩展库入门教程。
加菲猫的VFP
2022/04/07
1K0
瓜哥教你上手就赢,VFP专属FLL开发入门
微软VC运行库下载-Windows常用运行库完整版 V2023下载-Windows
安装这些运行库可以使得应用程序能够在Windows系统上正确运行,如果您发现某个应用程序无法正常运行,可能需要安装相应的运行库。可以从Microsoft官方网站或者第三方下载站点下载并安装这些运行库。
用户10519170
2023/04/21
1.6K0
c/c++ 软件集成 安装和可卸载软件
  作为一个工程师应具备的一些能力: 1. 首先具备这款软件:     >inno  Setup      免费版还开源,良心货,妥妥的。 2. 这款软件上手也比较款,可自行参考使用文档 3.编译成功,生成代码之后,样子可能如下: 1 ; Script generated by the Inno Setup Script Wizard. 2 ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3
Gxjun
2018/03/26
1.2K0
c/c++ 软件集成 安装和可卸载软件
Visual C++ 微软常用运行库合集_2022.09.15
Microsoft Visual C++ Redistributable(简称MSVC,VB/VC,VC运行库)系统运行库是Windows操作系统应用程序的基础类型库的可再发行程序包.Microsoft Visual C++运行库是系统装机必备组件,此版VC++运行库合集(微软常用运行库合集),整合了所有版本Visual C ++,可以自选更新VC++版本组件,并提供图形安装界面.
星泽V社
2022/11/01
24.8K0
Visual C++ 微软常用运行库合集_2022.09.15
VC库的版本区分和对CPU算力的影响
HKLM\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\X64 HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\X64
Windows技术交流
2024/05/29
3790
[Setting]win7下运行exe失败:应用程序无法启动,因为应用程序的并行配置不正确
因为他们是新装的系统,给他们装的是Win7 32bit的系统,其它什么都没安装,根据网上的说明,估计是两个问题。
祥知道
2020/03/10
30.2K0
找不到MSVCR120.dll、VCRUNTIME140.dll、MSVCP140.dll
我做了个WinPE,在其中安装了https://www.falkon.org/ 浏览器,打开的时候报找不到MSVCR120.dll
Windows技术交流
2022/12/21
2.3K0
win7应用程序无法正常启动0xc0000142(0xc000007b解决方案)
我们新安装的windows10后,有一些应用程序活游戏无法正常启动,产生(0xc000007b)错误,产生的原因有以下三种可能:1、DirectX9没有安装2、MicrosoftVisualC++没有安装3、.net没有安装解决的方法有两种:第1种:安装VisualStudio2010(如果你需要编程的话)32位系统只安装32位的即可,64
Java架构师必看
2022/04/11
1.2K0
boost编译
经历了将近半年多的时间boost终于发布了1.35.0版本(前版本1.34.1发布于2007/7), 其编译方法和原来的编译方法基本上是一致的,主要改变包括1.34.0以来bjam的toolset所 提供的参数名称的改变(具体参见《boost1.34.0编译日志》)外,还包括bjam的编译默认 选项的变化,在1.35.0之前的版本默认编译时会自动编译各种版本的库,包括静态库、 动态库、debug库和release库等全部的版本,但是到了1.35.0时默认的选择仅仅编译release 版本的库,这样一来在开发的时候就不能进行必要的调试了,为了能够使其编译全部的版本 需要在bjam的命令行参数中添加一个–build-type=complete类型的参数来指明需要编译全 部的版本,所需要编译同时为了使得regex库能够通过ICU库支持Unicode,在编译上需要有 一些特殊的选择。我在Visual Studio 2005 Pro + SP1环境下编译了该库,为了避免走弯路 所以将其编译的方法进行说明,以方便大家编译。 由于boost是采用其自己的bjam工具通过命令行进行编译的,所以必须在Windows下开启console窗口,同时必须将Visual Studio中C++目录下的环境vcvarsall.bat配置脚本运行一遍,以设置好VC的编译器环境变量。 1. 编译不带ICU支持的boost库 此种情况下的boost库编译起来比较的简单,在准备好的console窗口中输入:
用户3519280
2023/07/08
3580
如何在各个版本的VC及64位下使用CPUID指令
 前面我们探讨了在16位的DOS实模式下使用CPUID指令(http://www.cnblogs.com/zyl910/archive/2012/05/14/dos16_getcpuid.html)。而现在64位Windows系统已经很流行了,在32/64位模式下如何使用CPUID呢?于是本文介绍了如何在各个版本的VC及64位下使用CPUID指令。
用户3519280
2023/07/06
9240
如何在各个版本的VC及64位下使用CPUID指令
系统上是否可以只共存多个版本visual c++可再发行包最新版的验证结果
最近在添加与删除程序中发现,系统中Microsoft Visual C++ Redistributable Package存在很多版本的,从2005、2008、2010都有,而且同一个发行版下还存在多个版本的。这都是安装visual studio(我只安装了visual studio 2012)、各类软件自带的发行包搞的。
williamwong
2018/07/24
3.1K0
系统上是否可以只共存多个版本visual c++可再发行包最新版的验证结果
从最小依赖角度谈静态库与动态库的选择及配置策略
在软件工程中,减少外部依赖不仅可以降低部署复杂度,还能提高系统的稳定性和安全性。本文将从“最小依赖”的角度出发,详细探讨在 C++ 项目中如何在静态库与动态库之间做出选择,并对常见的编译配置(如 /MT 与 /MD)的利弊进行分析。通过理论解析、代码示例与对比表格,帮助开发者在项目架构设计阶段作出更合理的决策。
码事漫谈
2025/02/24
2130
从最小依赖角度谈静态库与动态库的选择及配置策略
推荐阅读
相关推荐
各个版本Microsoft Visual C++运行库下载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档