编辑
2023-04-17
实用工具
00
请注意,本文编写于 717 天前,最后修改于 279 天前,其中某些信息可能已经过时。

目录

简介
Mapstruct 依赖
属性类型相同名称不同
String转日期&String转数字&忽略某个字端&给默认值等

简介

🎯先上结论,Mapstruct的性能远远高于BeanUtils,这应该是大佬使用Mapstruct的主要原因,下面是我的测试结果,可以看出随着属性个数的增加,BeanUtils的耗时也在增加,并且BeanUtils的耗时跟属性个数成正比,而Mapstruct的耗时却一直是1秒,所以从对比数据可以看出Mapstruct是非常优秀的,其性能远远超过BeanUtils。

官网

Mapstruct 依赖

xml
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.0.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.0.Final</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>

定义UserPo和UserEntity

两个类的属性相同

java
package mapstruct; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class UserPo { private Long id; private Date gmtCreate; private Date createTime; private Long buyerId; private Long age; private String userNick; private String userVerified; }
java
package mapstruct; import lombok.Data; import java.util.Date; @Data public class UserEntity { private Long id; private Date gmtCreate; private Date createTime; private Long buyerId; private Long age; private String userNick; private String userVerified; }

定义转换接口

定义mapstruct接口,在接口上打上@Mapper注解。 接口中有一个常量和一个方法,常量的值是接口的实现类,这个实现类是Mapstruct默认帮我们实现的,下文会讲到。定义了一个po2entity的转换方法,表示把入参UserPo对象,转换成UserEntity。 注意@Mapper是Mapstruct的注解,不要引错了。

java
package mapstruct; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @Mapper public interface IPersonMapper { IPersonMapper INSTANCT = Mappers.getMapper(IPersonMapper.class); UserEntity po2entity(UserPo userPo); }

测试

java
package mapstruct; import org.springframework.beans.BeanUtils; import java.util.Date; public class MapStructTest { public static void main(String[] args) { testNormal(); } public static void testNormal() { System.out.println("-----------testNormal-----start------"); UserPo userPo = UserPo.builder() .id(1L) .gmtCreate(new Date()) .buyerId(666L) .userNick("测试mapstruct") .userVerified("ok") .age(18L) .build(); System.out.println("1234" + userPo); UserEntity userEntity = IPersonMapper.INSTANCT.po2entity(userPo); System.out.println(userEntity); System.out.println("-----------testNormal-----ent------"); } }

结果

Mapstruct 性能优于 BeanUtils 的原因

Java程序执行的过程,是由编译器先把java文件编译成class字节码文件,然后由JVM去解释执行class文件。Mapstruct正是在java文件到class这一步帮我们实现了转换方法,即做了预处理,提前编译好文件,如果用过lombok的同学一定能理解其好处,通过查看class文件,可以看出IPersonMapper被打上org.mapstruct.Mapper注解后,编译器自动会帮我们生成一个实现类IPersonMapperImpl,并实现了po2entity这个方法。

属性类型相同名称不同

对于属性名称不同的属性进行处理时,需要使用@Mapping,比如修改UserEntity中的userNick为userNick1,然后进行转换。

@Mapping注解指定source和target字段名称对应关系 @Mapping(target = "userNick1", source = "userNick"),此处的意思就是在转化的过程中,将UserPo的userNick属性值赋值给UserEntity的userNick1属性。

java
package mapstruct; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper public interface IPersonMapper { IPersonMapper INSTANCT = Mappers.getMapper(IPersonMapper.class); @Mapping(target = "userNick1", source = "userNick") UserEntity po2entity(UserPo userPo);}

String转日期&String转数字&忽略某个字端&给默认值等

java
@Mapping(target = "createTime", source = "createTime", dateFormat = "yyyy-MM-dd") @Mapping(target = "age", source = "age", numberFormat = "#0.00") @Mapping(target = "id", ignore = true) @Mapping(target = "userVerified", defaultValue = "defaultValue-2")

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!