对象转换神器-MapStruct

MapStruct是一个基于约定优于配置的代码生成器,用于简化Java Bean之间的映射转换。相比手动get/set方法,MapStruct在编译时生成转换代码,提供高性能、类型安全且易于理解的解决方案。与其他Bean拷贝工具如BeanCopier、Orika和Dozer等相比,MapStruct在性能和便捷性上具有优势。
摘要由CSDN通过智能技术生成

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

如何接入MapStruct

IDEA Support: https://plugins.jetbrains.com/plugin/10036-mapstruct-support/versions

Java Bean属性拷贝对比

  • 性能
get/set >= [MapStruct](http://mapstruct.org/) > [JMapper](https://jmapper-framework.github.io/jmapper-core/)  >  ["beanCopier(cglib)"](https://github.com/cglib/cglib/blob/master/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java) > Orika > ModelMapper > Spring BeanUtils > Dozer > Apache BeanUtils
  • 性能对比数据来源:

    • https://www.baeldung.com/java-performance-mapping-frameworks
    • https://java.libhunt.com/categories/337-bean-mapping
  • 对比结果:

    • get/set 需要手动编写大量转换代码,代码简洁性差、重复性高和工作量大。
    • beanCopier 性能较高,属性名和类型有较高的匹配要求。
    • MapStruct 性能较高,在编译阶段,生成Get/Set代码,支持不同属性之间自定义转换。
    • Orika 性能较高,支持自定义属性拷贝,性能略差与前两种,但比后面几种高很多。属性名相同单类型不同事需编写转换规则,否则会报错
    • Spring BeanUtils 性能一般,只能支持相关名称的拷贝。
    • Dozer 性能差,使用简单,编写xml不方便。
    • Apache BeanUtils 性能差。

demo

实例代码:

/**
* 定义对象之间转换Mapper
 * @Mapper 只有在接口加上这个注解, MapStruct 才会去实现该接口
 *     @Mapper
 *     componentModel :主要是指定实现类的类型,
 *         - default:默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象
 *         -  spring:在接口的实现类上自动添加注解 @Component,可通过 @Autowired 方式注入
 *     uses 使用用户自定义转换器
 *
 *     http://mapstruct.org/documentation/stable/reference/html/
 */
//@Mapper(componentModel = "spring",uses = {DateHandWritten.class})
@Mapper(
        uses = {
   DateHandWritten.class, UserNameHandWritten.class},
        imports = {
   LocalDateUtil.class}
        )
public interface PersonMapper {
   

    PersonMapper  INSTANCE  = Mappers.getMapper(PersonMapper.class);

    @Mappings(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值