还在用BeanUtils拷贝对象?MapStruct才是王者!【附源码】(五)

687 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

上文中我们对 @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.javaMall4S.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可以加入技术交流群参与讨论呦!