mapstruct:还可以这么懒的嘛

导入jar包:(mapstruct 可以方便将业务对象Do转化为数据传输对象Dto) 

        <dependency>
            <groupId>org.mapstruct</groupId>
            <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>

 需要转换成的Dto:

@Data
public class PersonDto {
    private Long id;
    
    private String name;
 
    private Integer age;
    
    private String email;

    private String grade;

    private Date birth;

    private String birthDateFormat;

    private String birthExpressionFormat;
}

Do1:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonDo {
    private Long id;
    private String name;
    private String email;
    private Date birthday;
    private User user;
}

 

Do1里用到的User类:

@Data
public class User {
    private Integer id;
    private String username;
    private String address;
    private String gender;
    private Integer age;
}

Do2: 

@Data
@AllArgsConstructor
public class StudentDo {
    private String grade;
}

建立映射:

@Mapper
public interface PersonConvert {
    PersonConvert instance = Mappers.getMapper(PersonConvert.class);

    @Mappings({
            @Mapping(source = "person.birthday", target = "birth"),
            @Mapping(source = "person.birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
            @Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),\"yyyy-MM-dd HH:mm:ss\"))"),
            @Mapping(source = "person.user.age", target = "age"),
            @Mapping(target = "email", ignore = true),
            @Mapping(source = "student.grade",target = "grade")
    })
    PersonDto domain2dto(PersonDo person,StudentDo student);

    @InheritConfiguration(name = "domain2dto")
    void update(PersonDo person,StudentDo student,@MappingTarget PersonDto personDto);
}

 编辑之后Idea会自动生成一个PersonConvertImpl:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2019-05-27T11:16:01+0800",
    comments = "version: 1.2.0.Final, compiler: javac, environment: Java 1.8.0_112 (Oracle Corporation)"
)
public class PersonConvertImpl implements PersonConvert {

    @Override
    public PersonDto domain2dto(PersonDo person, StudentDo student) {
        if ( person == null && student == null ) {
            return null;
        }

        PersonDto personDto = new PersonDto();

        if ( person != null ) {
            personDto.setBirth( person.getBirthday() );
            if ( person.getBirthday() != null ) {
                personDto.setBirthDateFormat( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( person.getBirthday() ) );
            }
            Integer age = personUserAge( person );
            if ( age != null ) {
                personDto.setAge( age );
            }
            personDto.setId( person.getId() );
            personDto.setName( person.getName() );
        }
        if ( student != null ) {
            personDto.setGrade( student.getGrade() );
        }
        personDto.setBirthExpressionFormat( org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),"yyyy-MM-dd HH:mm:ss") );

        return personDto;
    }

    @Override
    public void update(PersonDo person, StudentDo student, PersonDto personDto) {
        if ( person == null && student == null ) {
            return;
        }

        if ( person != null ) {
            personDto.setBirth( person.getBirthday() );
            if ( person.getBirthday() != null ) {
                personDto.setBirthDateFormat( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( person.getBirthday() ) );
            }
            Integer age = personUserAge( person );
            if ( age != null ) {
                personDto.setAge( age );
            }
            personDto.setId( person.getId() );
            personDto.setName( person.getName() );
        }
        if ( student != null ) {
            personDto.setGrade( student.getGrade() );
        }
        personDto.setBirthExpressionFormat( org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),"yyyy-MM-dd HH:mm:ss") );
    }

    private Integer personUserAge(PersonDo personDo) {
        if ( personDo == null ) {
            return null;
        }
        User user = personDo.getUser();
        if ( user == null ) {
            return null;
        }
        Integer age = user.getAge();
        if ( age == null ) {
            return null;
        }
        return age;
    }
}

也可以在 PersonConvert 中定义

List<PersonDto> domain2dto(PersonDo personDo); 编辑文件也会自动生成这样转换

总结:

   用起来的话可以不用考虑转换过程中很多null的情况,避免自己的出错,使用起来更加方便;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值