0
点赞
收藏
分享

微信扫一扫

使用MapStruct告别BeanUtils(简单入门)

小典典Rikako 2023-08-21 阅读 37

使用MapStruct告别BeanUtils(简单入门)_java

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

与动态映射框架相比,MapStruct 具有以下优势:(1)通过使用普通方法getter、setter调用,而不是反射来快速执行,效率很高。(2)编译时类型安全:只能映射相互映射的对象和属性,不会将其余模型属性进行映射。

多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct旨在通过尽可能自动化来简化这项工作。 与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。

MapStruct是一个插入Java编译器的注释处理器,可以在命令行构建(Maven、Gradle等)中使用,也可以在首选IDE中使用。 MapStruct使用了合理的默认值,但在配置或实现特殊行为时会避开您。

MapStruct的性能远远大于BeanUtils的性能;

使用场景:当你要想使用BeanUtils进行对象拷贝映射时,就可以使用MapStruct

使用:

导入maven:

<!--mapstruct-->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
</dependency>

创建要拷贝的对象

@Data
public class PatrolA implements Serializable {
    @Serial
    private static final long serialVersionUID = 825820175244192571L;
    @ApiModelProperty("字段A")
    private String a;
    @ApiModelProperty("字段B")
    private Integer b;
    @ApiModelProperty("字段C")
    private String c;
    @ApiModelProperty("字段D")
    private String d;
    @ApiModelProperty("字段E")
    private String e;
}

@Data
public class PatrolB implements Serializable {
    @Serial
    private static final long serialVersionUID = 825820175544192571L;
    @ApiModelProperty("字段A")
    private String A;
    @ApiModelProperty("字段B")
    private Integer b;
    @ApiModelProperty("字段C")
    private String csdsdsdsdsd;
    @ApiModelProperty("字段D")
    private String d;
    @ApiModelProperty("字段E")
    private Date e;
}

创建一个映射器,只需使用所需的映射方法定义一个 Java 接口并使用注释对其进行org.mapstruct.Mapper注释:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;


@Mapper
public interface PatrolMapStructMapper {
    PatrolMapStructMapper INSTANCE = Mappers.getMapper(PatrolMapStructMapper.class);
    
    @Mapping(dateFormat = "yyyy-MM-dd",source = "e", target = "e")
    @Mapping(source = "a", target = "A")
    @Mapping(source = "c", target = "csdsdsdsdsd")
    PatrolB patrolCopy(PatrolA model);
}

MapStruct 还支持具有多个源参数的映射方法。这很有用,例如,为了将多个实体组合成一个数据传输对象。

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;


@Mapper
public interface OtherMapStructMapper {
    OtherMapStructMapper INSTANCE = Mappers.getMapper(OtherMapStructMapper.class);
    
   	@Mapping(target = "description", source = "person.description")
    @Mapping(target = "houseNumber", source = "address.houseNo")
    DeliveryDto personAndAddressToDeliveryDto(Person person, Address address);
}

底层实现举例:

使用MapStruct告别BeanUtils(简单入门)_MapStruct_02

使用举例:

//数据拷贝转换
PatrolB copy = PatrolMapStructMapper.INSTANCE.patrolCopy(patrolA);

其他高阶用法请参考官方文档

举报

相关推荐

0 条评论