1. 概述

MapStruct 可以将某几种类型的对象映射为另外一种类型,如将多个Domain 对象转换为 DTO,涉及到类似之间对象转换的都可以用它来完成。其主要作用就是:Java bean mappings

详细信息可以参考最新版本的文档:MapStruct 1.3.0.Final Reference Guide

本文的内容也是来源于官方文档,只是简单的做一个简单的说明,方便理解和快速的使用。

2 引入依赖

Spring项目中的简单使用,用Maven管理依赖,在pom文件中引入MapStruct:

     <org.mapstruct.version>1.3.0.Final</org.mapstruct.version><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version><scope>provided</scope></dependency>...<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>${java.version}</source><target>${java.version}</target><annotationProcessorPaths><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></path></annotationProcessorPaths></configuration></plugin>
12345678910111213141516171819202122232425

注意,需要jdk1.8以上。

2. 简单使用

2.1 基础mappings

定义Mapper接口

@Mapper
public interface CarMapper {@Mapping(source = "make", target = "manufacturer")     @Mapping(source = "numberOfSeats", target = "seatCount")     CarDto carToCarDto(Car car);@Mapping(source = "name", target = "fullName")     PersonDto personToPersonDto(Person person);}
123456789

2.2 Adding custom methods to mappers

可以使用@context注解,传入对象,起到一定的定制作用。

2.3 多个参数来源的映射

@Mapper
public interface AddressMapper {@Mapping(source = "person.description", target = "description")     @Mapping(source = "address.houseNo", target = "houseNumber")    DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);
12345

2.4 更新现有的 bean instances

使用@MappingTarget 传入一个bean,则更新的就是它:

@Mapper
public interface CarMapper {void updateCarFromDto(CarDto carDto, @MappingTarget Car car);}
1234

2.5 Mappings with direct field access

MapStruct同样支持没有getter/setter方法的映射。但是要求属性可以直接访问。

2.6 @AfterMapping和@BeforeMapping

在接口中实现这两个注解标注的default方法,会在映射前后调用:

@Mapper(componentModel = "spring")
public interface AddressMapper {AddressMapper MAPPER = Mappers.getMapper(AddressMapper.class);@Mapping(target = "name", source = "address.name")@Mapping(target = "gender", source = "person.gender")PersonAddressDto convert(Address address, Person person, @MappingTarget PersonAddressDto target);@AfterMappingdefault void afterMapping(Address address, @MappingTarget PersonAddressDto target) {}@BeforeMappingdefault void beforeMapping(Person person, @MappingTarget PersonAddressDto target) {}
}
1234567891011121314151617

其生成的实现类中,会分别生成前置和后置的映射:

@Component
public class AddressMapperImpl implements AddressMapper {@Overridepublic PersonAddressDto convert(Address address, Person person, PersonAddressDto target) {if ( address == null && person == null ) {return null;}//前置beforeMapping( person, target );if ( address != null ) {target.setName( address.getName() );}if ( person != null ) {target.setGender( person.getGender() );}//后置afterMapping( address, target );return target;}
}
1234567891011121314151617181920212223

4. Retrieving a mapper

4.1 The Mappers factory

org.mapstruct.factory.Mappers class. Just invoke the getMapper() method。

例如:

@Mapper(componentModel = "spring")
public interface AddressMapper {AddressMapper MAPPER = Mappers.getMapper(AddressMapper.class);@Mapping(target = "name", source = "address.name")@Mapping(target = "gender", source = "person.gender")PersonAddressDto convert(Address address, Person person);
}
123456789

getMapper方法,相当于从其实现类中new一个无参构造方法,则可以通过它调用对应的方法。

4.2 spring依赖注入

@Mapper#componentModel属性,在定义的接口上加上

@Mapper(componentModel = "spring")
1

会自动生成实现类,并使用@Component注解标注。

5. 数据类型转换

5.1 隐士类型转换

@Mapping注解:numberFormat 、dateFormat

5.2 Controlling nested bean mappings

5.3 Invoking other mappers

使用注解@Mapper(uses=XXX.class)
MapStruct 会从XXX.class中查找满足转化的方法

5.4 Passing the mapping target type to custom mappers

@MappingTarget

5.5 Passing context or state objects to custom methods

在方法中传入对象,借助这个对象来定制转换方法。借助于@Context

5.6 Mapping method selection based on qualifiers

使用qualifiers标志符,选择特定的方法来完成映射。qualifiedBy(class) 、qualifiedByName(使用@Name注解)
@Named:annotating the methods to qualify。可以用在类上和方法上。

MapStruct 入门使用相关推荐

  1. MapStruct入门及集成springboot

    MapStruct入门及集成springboot MapStruct官网地址: http://mapstruct.org/ 1.引入依赖 maven的pom.xml ... <propertie ...

  2. 学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门

    本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...

  3. 芋道 Spring Boot 对象转换 MapStruct 入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  4. 还在用 BeanUtils来做对象转换吗?快试试 MapStruct吧

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:阿进的写字台 https://www.cnblogs ...

  5. string转换bigdecimal_使用MapStruct处理恼人的bean转换

    烦人的Bean 转换 对于代码中 JavaBean之间的转换, 一直是困扰我很久的事情.在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化, 非常的影响观感, 却又不得不存在.我 ...

  6. MapStruct使用方法

    文章目录 本文介绍 基本使用 Student和StudentDTO转换 使用流程 源码分析 进阶使用 MapStruct提供的一些处理器选项配置 使用Spring依赖 属性名称不一致 属性类型不一致 ...

  7. list 转set_MapStruct高级用法:List和String互转

    需求背景:有一个业务对象,数据库里存的是分号隔开的String,在返回给前台时需要转换成List dao类TNotice中 @ApiModelProperty(value = "附件地址,以 ...

  8. 学习第三篇:【SpringBoot-Labs】芋道 Spring Boot 自动配置原理

    本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...

  9. 船新 IDEA 2020.3 插件大合集,个个都是精品!

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  10. PO VO DTO 转换神器替代BeanUtils 了

    PO VO DTO 1. MapStruct简介 2.0 MapStruct入门 2.0.1 简易demo 2.1. 引入依赖 2.2. 需要转换的对象 2.3. 创建转换器 2.4. 验证 2.5. ...

最新文章

  1. UE商城资源 Motion Symphony 运动匹配插件
  2. mysql创建和删除用户
  3. python实现定时发送qq消息
  4. Gateway网关-过滤器链执行顺序
  5. 蚂蚁金服疯了吗?大动作,非裁员,年底全员涨薪又涨假期!!!
  6. linux命令wget下载jdk(完整解决诸多异常)
  7. 数据时代总结思维导图模板分享及绘制技巧
  8. react优秀项目案例_关于进行2019年北京市高等学校“实培计划”项目——毕业设计(创业类)项目总结与优秀项目案例征集的通知...
  9. adpater里写toast_Android开发UI之Toast的使用
  10. js操作符类型转换大全
  11. ubuntu服务器系统管理软件,安装 Webmin 来管理你的 Ubuntu 主机
  12. map转json字符串字段排序
  13. 8uftp是不是要保存,4步掌握8uftp保存密码的方法
  14. JSONP原理以及示例
  15. iOS永久不掉签名工具,TrollStore超详使用教程
  16. Windows基础篇学习(上)
  17. Java获取电脑外网ip地址方法
  18. 没有投屏标志怎么投屏_没有【TV】小图标,手机怎么投屏电视
  19. windows server 一键启用图片查看器
  20. python_变量特性、作用域、函数

热门文章

  1. Apache Struts ‘includeParams’安全绕过漏洞
  2. LeetCode: Substring with Concatenation of All Words
  3. 升级成员服务器-从Windows 2012升级到2016案例之2
  4. UnicodeEncodeError: #39;ascii#39; codec can#39;t encode character u#39;\u5929#39; in position 2...
  5. PHP 判断常量,变量和函数是否存在
  6. RUP大讲堂(第五讲)-基于用例的需求工程技术
  7. 28.卷1(套接字联网API)---原始套接字
  8. 1.Yii2 -- Controller, Request, Response, Cookie, Session
  9. 17、1.7 eclipse使用入门
  10. 【转】linux kernel 网络协议栈之GRO(Generic receive offload)