依赖包

<dependency>
    <groupId>org.mapstruct</groupId>
    <!-- jdk8以下就使用mapstruct -->
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.2.0.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.2.0.Final</version>
</dependency>

使用

数据准备

// 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    private Integer id;
    private String name;
    private String createTime;
    private LocalDateTime updateTime;
}
 
// 被映射类VO1:和实体类一模一样
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO1 {
    private Integer id;
    private String name;
    private String createTime;
    private LocalDateTime updateTime;
}
 
// 被映射类VO1:比实体类少一个字段
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO2 {
    private Integer id;
    private String name;
    private String createTime;
 
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO3 {
    private String id;
    private String name;
    // 实体类该属性是String
    private LocalDateTime createTime;
    // 实体类该属性是LocalDateTime
    private String updateTime;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO4 {
    // 实体类该属性名是id
    private String userId;
    // 实体类该属性名是name
    private String userName;
    private String createTime;
    private String updateTime;
}

普通转换

@Mapper(componentModel = "spring")
public interface UserCovertBasic {
    UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class);
 
    /**
     * 字段数量类型数量相同,利用工具BeanUtils也可以实现类似效果
     * @param source
     * @return
     */
    UserVO1 toConvertVO1(User source);

    User fromConvertEntity1(UserVO1 userVO1);
 
    /**
     * 字段数量类型相同,数量少:仅能让多的转换成少的,故没有fromConvertEntity2
     * @param source
     * @return
     */
    UserVO2 toConvertVO2(User source);
}

转换一个集合

    List<UserVO1> toConvertVOList(List<User> source);

复杂转换

    // 方式一:调用自定义方法(见下方)
    @Mappings({
            @Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"),
    })
    UserVO3 toConvertVO3(User source);
 
    User fromConvertEntity3(UserVO3 userVO3);

    // 方式二:调用提供的dateFormat 方法
    @Mappings({
            @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss"),
    })
    UserVO3 toConvertVO3_1(User source);

    // 字段名不一致
    @Mappings({
            @Mapping(source = "id", target = "userId"),
            @Mapping(source = "name", target = "userName")
    })
    UserVO4 toConvertVO(User source);
    
    User fromConvertEntity4(UserVO4 userVO4);

上面 expression 指定的表达式内容如下:

public class DateTransform {
    public static LocalDateTime strToDate(String str){
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
        return LocalDateTime.parse("2018-01-12 17:07:05",df);
    }
 
}

小结

1、基本类型及其他们对应的包装类型。
此时 mapstruct 会自动进行拆装箱。不需要人为的处理
2、基本类型的包装类型和string类型之间

当字段名不一致时,通过使用 @Mappings 注解指定对应关系,编译后即可实现对应字段的赋值。

属性是枚举类型:默认取的是基础的枚举的name属性

// 编译后:
    public UserVO5 convertEnum(UserEnum userEnum) {
        if (userEnum == null) {
            return null;
        } else {
            UserVO5.UserVO5Builder userVO5 = UserVO5.builder();
            if (userEnum.getUserTypeEnum() != null) {
                userVO5.type(userEnum.getUserTypeEnum().name());
            }

            userVO5.id(userEnum.getId());
            userVO5.name(userEnum.getName());
            return userVO5.build();
        }
    }

// 取的是"Java","DB","LINUX"
@Getter
@AllArgsConstructor
public enum UserTypeEnum {
    Java("000", "Java?????"),
    DB("001", "??????"),
    LINUX("002", "Linux???");

    private String value;
    private String title;

}
posted on 2024-11-11 14:47  幂次方  阅读(8)  评论(0编辑  收藏  举报