平时开发中会遇到各自对象之间的转换,之前需要自己写大量的set、get方法去进行转换赋值,使用MapStruct可以替代传统的get和set方法的转换,并且效率相当,省去了手写转换方法的过程,一定程度上提高了开发效率。
1.引入依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</dependency>
2.需要转换的对象及目标对象结构
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {
private String userName;
private String phone;
private String type;
private List<CarDto> cars;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CarDto {
private String brandName;
private String price;
private String color;
}
-----------目标对象-------------------
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private String phone;
private String nationality;
private String userType;
private List<Car> carList;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Car {
private String brand;
private String price;
private String color;
}
3.编写转换器
常用的场景见例子中:
@Mapper
public interface PersonConverter {
//将原对象中每个属性值映射到目标对象的属性上,同名称会自动映射
@Mapping(target = "name", source = "userName")
//将目标对象中每个熟悉统一设置为一个常量
@Mapping(target = "nationality", constant = "China")
//映射某个值,并设置当原属性为空时的默认值
@Mapping(target = "userType", source = "type",defaultValue = "普通用户")
@Mapping(target = "carList", source = "cars")
Person personDto2Person(PersonDto personDto);
@Mapping(target = "brand", source = "brandName")
Car carDto2Car(CarDto carDto);
}
4.构建项目生成对应的实现类
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2022-09-02T09:54:11+0800",
comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_131 (Oracle Corporation)"
)
public class PersonConverterImpl implements PersonConverter {
@Override
public Person personDto2Person(PersonDto personDto) {
if ( personDto == null ) {
return null;
}
PersonBuilder person = Person.builder();
person.name( personDto.getUserName() );
if ( personDto.getType() != null ) {
person.userType( personDto.getType() );
} else {
person.userType( "普通用户" );
}
person.carList( carDtoListToCarList( personDto.getCars() ) );
person.phone( personDto.getPhone() );
person.nationality( "China" );
return person.build();
}
@Override
public Car carDto2Car(CarDto carDto) {
if ( carDto == null ) {
return null;
}
CarBuilder car = Car.builder();
car.brand( carDto.getBrandName() );
car.price( carDto.getPrice() );
car.color( carDto.getColor() );
return car.build();
}
protected List<Car> carDtoListToCarList(List<CarDto> list) {
if ( list == null ) {
return null;
}
List<Car> list1 = new ArrayList<Car>( list.size() );
for ( CarDto carDto : list ) {
list1.add( carDto2Car( carDto ) );
}
return list1;
}
}
生成规则:
1.当原属性与其目标实体对应的名称相同时,它将被隐式映射。
2.当原属性在目标实体中具有不同的名称时,通过@Mapping注释指定其名称映射关系。