MapStruct的入门教程

MapStruct的入门教程

为什么需要MapStruct

多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射。编写此类映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过使其尽可能自动化来简化这项工作。

与其他映射框架相比,MapStruct在编译时生成Bean映射,以确保高性能,允许快速的开发人员反馈和彻底的错误检查。

什么是MapStruct

MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。

生成的映射代码使用简单的方法调用,因此快速,类型安全且易于理解。

MapStruct是一个注释处理器,已插入Java编译器,可用于命令行构建(Maven,Gradle等),也可以在您首选的IDE中使用。

MapStruct使用合理的默认值,但是在配置或实现特殊行为时会避开您的使用。

MapStruct初体验

  1. 下面显示了如何使用MapStruct映射两个对象。假设我们有一个代表汽车的类Car(例如JPA实体)和一个附带的数据传输对象CarDto (DTO)。两种类型非常相似,只有座位数属性具有不同的名称,并且该类型属性在Car类中具有特殊的枚举类型,但在DTO中是纯字符串。

    public class Car {
        private String make;
        private int numberOfSeats;
        private CarType type;
     
        //constructor, getters, setters etc.
    }
    
    public class CarDto {
        private String make;
        private int seatCount;
        private String type;
     
        //constructor, getters, setters etc.
    }
    
  2. 要生成用于从CarDto对象中创建对象Car的映射器,需要定义一个映射器接口:

    @Mapper
    public interface CarMapper {
     
        CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
     
        @Mapping(source = "numberOfSeats", target = "seatCount")
        CarDto carToCarDto(Car car);
    }
    

    该@Mapper注解将接口标记为映射接口,并使MapStruct处理器在编译期间启动。实际的映射方法carToCarDto期望源对象作为参数并返回目标对象。其名称可以自由选择。
    对于源对象和目标对象中具有不同名称的属性,可以使用@Mapping注解来配置名称。在必要和可能的情况下,将对源和目标中具有不同类型的属性执行类型转换,例如,将type属性从枚举类型转换为字符串。
    当然,一个接口中可以有多种映射方法,MapStruct将为所有这些方法生成一个实现。可以从Mappers类中检索接口实现的实例。按照约定,该接口声明一个成员INSTANCE,为客户提供对Mapper实施的访问权限。

  3. 使用映射器。基于映射器接口,客户端可以以非常简单且类型安全的方式执行对象映射:

    @Test
    public void shouldMapCarToDto() {
        //given
        Car car = new Car( "Morris", 5, CarType.SEDAN );
     
        //when
        CarDto carDto = CarMapper.INSTANCE.carToCarDto( car );
     
        //then
        assertThat( carDto ).isNotNull();
        assertThat( carDto.getMake() ).isEqualTo( "Morris" );
        assertThat( carDto.getSeatCount() ).isEqualTo( 5 );
        assertThat( carDto.getType() ).isEqualTo( "SEDAN" );
    }
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值