mapstruct -- 一款好用、优雅的JavaBean映射工具

一、了解它

1.它是什么?

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

2.为什么要使用它?

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

以往的开发中,我们可能会用到类似BeanUtil的一些映射框架,他们一般是通过Java的反射机制去完成的,这对于性能是有一定损耗的(虽然对于一些优秀的BeanUtil框架,性能损耗可以忽略,详见各种Bean映射性能对比)。

与动态映射框架相比,MapStruct具有以下优点:

  • 通过使用普通方法调用代替反射来快速执行(生成的代码位于 target/generated-sources/annotations/ 目录)。

  • 编译时类型安全:只有指明的对象和属性可以相互映射,不会出现一个order entity 被映射为customer DTO 等情况。

  • 在build时即可清除映射错误:

    • 映射不完整(并非所有的目标属性都被映射)
    • 映射不正确(找不到合适的映射方法或类型转换)

3.一些网站

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

示例:GitHub - mapstruct/mapstruct-examples: Examples for using MapStruct

汉译:MapStruct 1.4.2.最终参考指南_白云苍饭的博客-CSDN博客

4. 技术千万种,简单第一种。前人秀操作,后人两行泪。

(只针对mapstruct框架,因为没有必要让团队都花费很大的精力,去研究一个映射工具)

尽量简单、易读、易懂、易于维护,对于很复杂的表达,可以用原生语句去实现,不要为了用而用,产生高深的维护“护城河”。

二、开始

1.基于Maven

未来如果用的项目多了,可以集成到公共框架 / quickstart项目中。

<properties>

    <!--目前最新的版本已经前展了很多,但都非正式版本。在不追求新的一些写法、尝试解决一些问题、充分的评估的情况下,维持此版本即可-->

    <!--https://mapstruct.org/documentation/reference-guide/-->

    <org.mapstruct.version>1.4.2.Final</org.mapstruct.version>

</properties>

 

<dependency>

    <groupId>org.mapstruct</groupId>

    <artifactId>mapstruct</artifactId>

    <version>${org.mapstruct.version}</version>

</dependency>

<dependency>

    <groupId>org.mapstruct</groupId>

    <artifactId>mapstruct-processor</artifactId>

    <version>${org.mapstruct.version}</version>

</dependency>

2. IDE

①. 目前对于idea是直接支持的,eclipse还请自行百度

当我们执行过一次maven编译时,mapstruct已经帮我们生成了实现类,这时会出现以下图标,我们可以通过点击这些图标,快速跳转到实现类或者实现方法,来验证代码或者检查问题。

 

3. 获取实例:

①. Spring:在编写的转化类(可以是接口,也可以是抽象类)上打上@Mapper(componentModel = "spring")的注解,这将允许我们通过@Autowired 注入。

②. 其他注入方式或获取实例的方式(推荐上述方法①)。

4.常用的几个注解:

@Mapper、@MapperConfig、@Mapping、@IterableMapping、@Named,这在后面会继续说到。

5.一个简单的开始

①.首先我们需要在转化类(可以是接口,也可以是抽象类)上打上@Mapper的注解,这时mapstruct才会帮我们处理。

一般更建议使用@Mapper(componentModel = "spring"),这样我们可以通过@Autowired 进行注入。

②.转化方法:如果没有要处理的映射关系,我们不需要任何处理,只需要声明一个方法,入参是映射前的Class,返回值是映射后的Class。mapstruct会帮我们处理。

③.使用:通过注入的实例,调用转化方法即可。也可参照下面代码中的注释。

我们无需关注字段是setter/getter还是字段访问,也无需关注是构造函数还是builders,它都会帮我么处理映射。但是来自lombok的 @Data(staticConstructor = "of") 或者@Builder(access = AccessLevel.PRIVATE)是不被支持的。需要修改pom文件annotationProcessor的顺序。

 

更多的实例在下面,希望各位大佬继续补充一些自己的用法或者遇到的问题、解决方法,为刚开始使用的小伙伴能找到他想要的实例。

/**

 * 两种使用方式:

 *      完全看个人习惯,但建议使用注入的方式,写的代码短了".instance" 9个字符,为如何控制行长的烦恼更少了一些  (^_^ )

 *

 * 1.使用 RepayConvert.INSTANCE...

 *      例:RepayConvert.INSTANCE.convertRepayCalculate();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值