1.mapstruct

1.1 介绍

mapstruct是一种实体类框架,能够通过Java注解将一个实体类的属性安全地赋值给另一个实体类。

有了mapstruct,只需要定义一个映射器接口,声明需要映射的方法,在编译过程中,mapstruct会自动生成该接口的实现类,实现将源对象映射到目标对象的效果。

1.2 优点

实体类映射框架大致有两种:一种是运行期通过java反射机制动态映射;另一种是编译期动态生成getter/setter,在运行期直接调用框架编译好的class类实现实体映射。

  • 由于mapstruct映射是在编译期间实现的,因此相比运行期的映射框架有以下几个优点
    • 安全性高。因为是编译期就实现源对象到目标对象的映射, 如果编译器能够通过,运行期就不会报错。
    • 速度快。速度快指的是运行期间直接调用实现类的方法,不会在运行期间使用反射进行转化。

1.3 使用

1.3.1 定义实体类

  1. public class UserDTO{
  2. String name;
  3. Father father;
  4. }
  5. public class User {
  6. String username;
  7. Integer fatherId;
  8. String fatherName;
  9. }

需求:实现UserDTO到User的属性映射。

1.3.2 定义接口

  • 在UserConverter接口上添加@Mapper注解,在编译的时候,mapstruct自动会生成一个UserConverter的实现类,实现userDtoToVo方法。
  • userDtoToPo方法上的@Mappings主要用于特殊映射,比如上述的UserDto中的name想要映射成username,则通过@Mappings告诉mapstruct将source中的name映射成target中的username字段。
  1. @Mapper
  2. public interface UserConverter {
  3. UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
  4. @Mappings({
  5. @Mapping(source = "name", target = "username")
  6. @Mapping(source = "father.id", target = "fatherId")
  7. @Mapping(source = "father.name", target = "fatherName")
  8. })
  9. User userDtoToPo(UserDTO userDto);
  10. }

1.3.3 调用

  1. @PostMapping
  2. public AjaxResult Login(UserDTO userDto){
  3. User user = UserConverter.INSTANCE.userDtoToPo(userDto);
  4. //此时即可使用user
  5. }

使用方式不只是局限于此,所以想要使用对象映射的地方都可以使用该方法!