MapStruct–Java实体映射工具类

在开发中,经常会遇到多个Bean之间互相转换,尤其是vo, bo, dto等bean之间的转换更加频繁,而每次手写一段get, set方法更加费力。为了提高开发效率,出现了一些bean之间自动转换的方案,MapStruct就是其中之一。MapStruct是在编译器生成get,set方法实现实体映射,而不是通过反射的方式,所以效率比较高。

MapStruct的官网 https://mapstruct.org/,手册 https://mapstruct.org/documentation/stable/reference/html/#basic-mappings

本文简单介绍下MapStruct的用法。

Maven依赖

基本映射

定义两个 DO 对象 Person 和 User,其中 user 是 Person 的一个属性 ,一个 DTO 对象 PersonDTO

再写一个 Mapper 接口 PersonConverter,其中两个方法,一个是单实体映射,另一个是List映射。

若源对象属性与目标对象属性名字一致,会自动映射对应属性,不一样的需要指定,也可以用 format 转成自己想要的类型,也支持表达式的方式,可以看到像 id、name、email这些名词一致的我并没有指定 source-target,而birthday-birth指定了,转换格式的 birthDateFormat 加了dateFormat 或者 birthExpressionFormat 加了 expression,如果某个属性你不想映射,可以加个 ignore=true

在IDE中会自动编译,生成对应的实现类。

写一个单元测试类 PersonConverterTest 测试一下

多对一

MapStruct 可以将几种类型的对象映射为另外一种类型,比如将多个 DO 对象转换为 DTO

例:两个 DO 对象 Item 和 Sku,一个 DTO 对象 SkuDTO

创建 ItemConverter(映射)接口,MapStruct 就会自动实现该接口

创建测试类,讲 Item 和 Sku 两个 DO对象,映射成一个 DTO 对象 SkuDTO

映射类添加自定义方法

如果已经有了接收对象,更新目标对象

Spring 注入的方式

刚才写的例子一直是默认的方式调用映射类方法

要和Spring框架结合,也很方便。在 @Mapper 后面加入 componentModel=”spring”

测试类改一下,用的 spring boot 的形式

 

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注