Java中的MapStruct实现详解

 更新时间:2023年11月27日 10:20:12   作者:一码评川  
这篇文章主要介绍了Java中的MapStruct实现详解,MapStruct 是一个代码生成器,它基于约定优先于配置的方法大大简化了 JavaBean 类型之间映射的实现,生成的映射代码使用普通方法调用,需要的朋友可以参考下

简单实现

引入依赖

<dependency>
 <groupId>org.mapstruct</groupId>
 <artifactId>mapstruct-jdk8</artifactId>
 <version>1.3.0.Final</version>
</dependency>
//注解处理器,根据注解自动生成mapper的实现
<dependency>
 <groupId>org.mapstruct</groupId>
 <artifactId>mapstruct-processor</artifactId>
 <version>1.2.0.Final</version>
</dependency>

我们在编译时会报 java: No property named “numberOfSeats” exists in source parameter(s). Did you mean “null”? 错误,经过查阅资料发现 mapstruct-processor 和 Lombok 的版本需要统一一下:mapstruct-processor:1.2.0.Final , Lombok:1.16.14。

准备实体类

Car.java 和 数据传输类 CarDto.java

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Car {
    private String make;
    private int numberOfSeats;
    private CarType type;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CarDto {
    private String make;
    private int seatCount;
    private String type;

}

创建映射器接口

定义映射方法

@Mapper
public interface CarMapper {
 
    CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );

    @Mapping(source = "numberOfSeats", target = "seatCount")
    CarDto carToCarDto(Car car); 
   
}

解析分析:

  • @Mapper 将接口标记为映射接口,并允许 MapStruct 处理器在编译期间启动。这里的 @Mapper 注解不是 mybatis 的注解,而是 org.mapstruct.Mapper 的;
  • 实际映射方法 carToCarDto() 期望源对象 Car 作为参数,并返回目标对象 CarDto ,方法名可以自由选择;
  • 对于源对象和目标对象中具有不同名称的属性,可以使用 @Mapping 注释来配置名称;
  • 对于源对象和目标对象中具有不同类型的属性,也可以使用 @Mapping 注释来进行转换,比如:类型属性将从枚举类型转换为字符串;
  • 一个接口中可以有多个映射方法,对于所有的这些方法,MapStruct 将生成一个实现;
  • 该接口的实现实例可以从 Mappers 中获得,接口声明一个 INSTANCE,为客户端提供对映射器实现的访问。

实现类

我们可以将代码进行编译,然后会发现在 target 文件中生成了 CarMapperImpl.class 文件:

在这里插入图片描述

从代码中可以看出 MapStruct 为我们自动生成了 set/get 代码,并且对枚举类进行了特殊处理。

客户端

@Test
public void shouldMapCarToDto() {

    Car car = new Car( "Morris", 5, CarType.SEDAN );
    CarDto carDto = CarMapper.INSTANCE.carToCarDto( car );
    System.out.println(carDto);
    
}

执行结果:

在这里插入图片描述

小结: MapStruct 基于 mapper 接口,在编译期动态生成 set/get 代码的 class 文件 ,在运行时直接调用该 class 文件。

到此这篇关于Java中的MapStruct实现详解的文章就介绍到这了,更多相关MapStruct实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springIOC的使用流程及spring中使用类型转换器的方式

    springIOC的使用流程及spring中使用类型转换器的方式

    Spring IOC是Spring框架的核心原理之一,它是一种软件设计模式,用于管理应用程序中的对象依赖关系,这篇文章主要介绍了springIOC的使用流程以及spring中如何使用类型转换器,需要的朋友可以参考下
    2023-06-06
  • java 父类子类有同名方法时如何调用的实现

    java 父类子类有同名方法时如何调用的实现

    这篇文章主要介绍了java 父类子类有同名方法时如何调用的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java将中文转化为拼音的简单代码示例

    Java将中文转化为拼音的简单代码示例

    在我们使用手机通讯录或各种APP的搜索功能时,既可以根据中文搜索,也可以根据拼音搜索,这种时候就使用到了中文转拼音的功能了,下面这篇文章主要给大家介绍了关于Java将中文转化为拼音的简单代码示例,需要的朋友可以参考下
    2024-03-03
  • springboot2如何集成ElasticSearch6.4.3

    springboot2如何集成ElasticSearch6.4.3

    这篇文章主要介绍了springboot2如何集成ElasticSearch6.4.3问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java获取IP地址以及MAC地址的示例代码

    Java获取IP地址以及MAC地址的示例代码

    IP地址是用于在网络上识别设备的唯一地址,而MAC地址是设备的物理地址,本文主要介绍了Java获取IP地址以及MAC地址的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Java位集合之BitMap实现和应用详解

    Java位集合之BitMap实现和应用详解

    这篇文章主要介绍了Java位集合之BitMap实现和应用的相关资料,BitMap是一种高效的数据结构,适用于快速排序、去重和查找等操作,通过简单的数组和位运算,可以在Java中实现BitMap,从而节省存储空间并提高性能,需要的朋友可以参考下
    2024-12-12
  • Java实现批量修改文件名和重命名的方法

    Java实现批量修改文件名和重命名的方法

    这篇文章主要介绍了Java实现批量修改文件名和重命名的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • springcloud微服务基于redis集群的单点登录实现解析

    springcloud微服务基于redis集群的单点登录实现解析

    这篇文章主要介绍了springcloud微服务基于redis集群的单点登录实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • protobuf与json转换小结

    protobuf与json转换小结

    protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类型可以作为json的key,protobuf提供方法进行转换
    2017-07-07
  • Netty分布式高性能工具类FastThreadLocal和Recycler分析

    Netty分布式高性能工具类FastThreadLocal和Recycler分析

    这篇文章主要为大家介绍了Netty分布式高性能工具类FastThreadLocal和Recycler分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论