导入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的情况,避免自己的出错,使用起来更加方便;