小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
上文中我们对 @Mapping 注解以及 expression 属性的使用进行了演示,本文我们将用案例引出 @MappingTarget 的使用以及对“多对象映射一个对象”进行扩展。
@Mappings
可以配置多个 @Mapping,例如
@Mappings({
@Mapping(source = "id", target = "carId"),
@Mapping(source = "name", target = "carName"),
@Mapping(source = "color", target = "carColor")
})
@MappingTarget
用于更新已有对象,还是用例子来说明吧:
1. 创建 BMWCar.java 类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class BMWCar {
private String make;
private int numberOfSeats;
private CarType type;
private String color;
private String price;
}
2. mapper 中创建更新方法,并查看实现类
// 更新方法
void updateBwmCar(Car car, @MappingTarget BMWCar bwmCar);
// 实现类
public void updateBwmCar(Car car, BMWCar bwmCar) {
if (car != null) {
bwmCar.setMake(car.getMake());
bwmCar.setNumberOfSeats(car.getNumberOfSeats());
bwmCar.setType(car.getType());
}
}
3. 客户端代码
@Test
public void updateBwmCar() {
Car car = new Car( "Morris", 5, CarType.SEDAN );
BMWCar bwmCar = new BMWCar("BWM", 5, CarType.SPORTS, "RED", "50w");
System.out.println("更新前 car:"+car.toString());
System.out.println("更新前 BWMCar:"+bwmCar.toString());
CarMapper.INSTANCE.updateBwmCar(car, bwmCar);
System.out.println("更新后 car:"+car.toString());
System.out.println("更新后 BWMCar:"+bwmCar.toString());
}
执行结果:
扩展:多个对象映射一个对象
1. 准备实体类 Benz4SMall.java 和 Mall4S.java
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Mall4S {
private String address;
private String mobile;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Benz4SMall {
private String address;
private String mobile;
private String make;
private int numberOfSeats;
}
2. mapper 创建转换方法并查看生成的实现类
Benz4SMall mallCarToBenzMall(Car car, Mall4S mall4S);
/**
* 实现类
*/
public Benz4SMall mallCarToBenzMall(Car car, Mall4S mall4S) {
if (car == null && mall4S == null) {
return null;
} else {
Benz4SMall benz4SMall = new Benz4SMall();
if (car != null) {
benz4SMall.setMake(car.getMake());
benz4SMall.setNumberOfSeats(car.getNumberOfSeats());
}
if (mall4S != null) {
benz4SMall.setAddress(mall4S.getAddress());
benz4SMall.setMobile(mall4S.getMobile());
}
return benz4SMall;
}
}
3. 客户端
@Test
public void mallCarToBenzMall() {
Car car = new Car( "Morris", 5, CarType.SEDAN );
Mall4S mall4S = new Mall4S("北京市", "135XXXX4503");
Benz4SMall benz4SMall = CarMapper.INSTANCE.mallCarToBenzMall(car, mall4S);
System.out.println(benz4SMall.toString());
}
执行结果
mapstruct 的使用情况就介绍到这里了,下文我们将比较一下它与其他拷贝工具类的优缺点。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!