【Mapstruct】详细使用


官网:https://mapstruct.org/documentation/installation/


    
      junit
      junit
      4.12
      test
    
    
      org.projectlombok
      lombok
      1.18.12
      provided
    
    
      org.mapstruct
      mapstruct
      ${mapstruct.version}
    
    
      org.mapstruct
      mapstruct-processor
      ${mapstruct.version}
    
    
      com.alibaba
      fastjson
      1.2.66
    

    
      joda-time
      joda-time
      2.10.6
    
    
      org.apache.commons
      commons-lang3
      3.10
    

    
      org.slf4j
      slf4j-api
      1.7.30
    
  

dto

@Data
@ToString
public class PersonDto implements Serializable {

    private Integer id;

    private String nickName;

    private String address;

    private List bagList;

    private String cardNo;

    private String birthdayStr;

    private Date registerDate;

    private Integer sex;

    private List foods;

    private String phone;

    private String buyStatus;

}

entity

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bag implements Serializable {

    private String title;
    
    private BigDecimal price;

    private Date buyDate;
}
@Data
@ToString
public class Person implements Serializable {

    private Integer id;

    private String nickName;

    private String address;

    private List bagList;

    private String cardNum;

    private Date birthdayDate;

    private String registerStr;

    private Integer gender;

    private List foods;

    private Integer buyed;
}

utils

@Slf4j
public class DateUtils {
    public static final String TIME_ZONE = "GMT+8";
    public static final String LUNA_DATE_TIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * String(yyyy-MM-dd HH:mm:ss)格式日期转为Date
     *
     * @param str
     * @return
     * @throws ParseException
     */
    public static Date parseDateTime(String str) throws ParseException {
        return org.apache.commons.lang3.time.DateUtils.parseDate(str, new String[]{LUNA_DATE_TIME});
    }


}
@Mapper
public interface PersonConvert {

    PersonConvert PERSON_CONVERT = Mappers.getMapper(PersonConvert.class);

    @Mappings({
            //映射
            @Mapping(source = "cardNum", target = "cardNo"),
            //Date 格式化为  String
            @Mapping(source = "birthdayDate", target = "birthdayStr", dateFormat = "yyyy-MM-dd"),
            //String  格式化为 Date
            @Mapping(target = "registerDate", expression = "java(com.luna.mapstruct.util.DateUtils.parseDateTime(person.getRegisterStr()))"),
            //映射默认值
            @Mapping(source = "gender", target = "sex", defaultValue = "1"),
            //默认表达式
            @Mapping(target = "foods", defaultExpression = "java(new java.util.ArrayList<>())"),
            //映射常量值
            @Mapping(target = "phone", constant = "123@qq.com")

    })
    PersonDto convertDto(Person person) throws Exception;

    /**
     * 将在转换执行
     * @param person
     * @param personDto
     */
    @AfterMapping
    default void convertBuyed(Person person, @MappingTarget PersonDto personDto) {
        if (person.getBuyed() != null && person.getBuyed() == 1) {
            personDto.setBuyStatus("已购");
        }
    }

    /**
     * 列表转换
     * @param peopleList
     * @return
     */
    List convertListDto(List peopleList);



//    @InheritConfiguration
    //取消默认转换,仅指定哪些字段映射
    @BeanMapping(ignoreByDefault = true)
    @Mappings({
            @Mapping(source = "id",target = "id")

    })
    PersonDto update(Person person, @MappingTarget PersonDto personDTO)throws Exception;


}

Test

public class AppTest {


    @Test
    public void testMapstruct() throws Exception {
//        testDto();
//        testListDto();
        testCustomDto();
    }

    public void testDto() throws Exception {
        Person person = new Person();
        person.setId(1);
        person.setNickName("张三");
        person.setAddress("杭州");
        person.setCardNum("123");
        person.setBirthdayDate(new Date());
        person.setRegisterStr("2022-01-01 12:00:00");
        List list = new ArrayList<>();
        list.add(new Bag("红色", BigDecimal.valueOf(1), new Date()));
        list.add(new Bag("黑色", BigDecimal.valueOf(2), new Date()));
        person.setBagList(list);
        person.setBuyed(1);
        PersonDto personDto =
                PersonConvert.PERSON_CONVERT.convertDto(person);
        System.out.println(JSON.toJSONString(personDto));


        person.setNickName("李四");
        PersonDto update = PersonConvert.PERSON_CONVERT.update(person, personDto);
        System.out.println(JSON.toJSONString(update));
    }

    /**
     * 自定义转换
     * @throws Exception
     */
    public void testCustomDto() throws Exception {
        Person person = new Person();
        person.setId(1);
//        person.setNickName("张三");
//        person.setAddress("杭州");
//        person.setCardNum("123");
        person.setBirthdayDate(new Date());
        person.setRegisterStr("2022-01-01 12:00:00");
        PersonDto personDto =
                PersonConvert.PERSON_CONVERT.update(person,new PersonDto());
        System.out.println(JSON.toJSONString(personDto));
    }


    public void testListDto() {
        Person person = new Person();
        person.setId(1);
        person.setNickName("张三");
        person.setAddress("杭州");
        person.setCardNum("123");
        person.setBirthdayDate(new Date());
        person.setRegisterStr("2022-01-01 12:00:00");
        List list = new ArrayList<>();
        list.add(new Bag("红色", BigDecimal.valueOf(1), new Date()));
        list.add(new Bag("黑色", BigDecimal.valueOf(2), new Date()));
        person.setBagList(list);
        List personDtoList =
                PersonConvert.PERSON_CONVERT.convertListDto(Arrays.asList(person));
        System.out.println(JSON.toJSONString(personDtoList));
    }


}