MapStruct

别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?

文章参考

源码地址:https://github.com/mapstruct/mapstruct 

官网推荐的 Demo: https://github.com/mapstruct/mapstruct-examples

简单实现
我们注意到官网中有涉及到简单样例的实现,我们用2分钟来分析一波:

  1. 引入依赖
<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。

  1. 准备实体类 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;

}
  1. 创建映射器接口,里边定义映射方法
@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,为客户端提供对映射器实现的访问。
  1. 实现类
    我们可以将代码进行编译,然后会发现在 target 文件中生成了 CarMapperImpl.class 文件:
    在这里插入图片描述
    从代码中可以看出 MapStruct 为我们自动生成了 set/get 代码,并且对枚举类进行了特殊处理。
  2. 客户端
@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 文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值