1. 痛点
一种框架的出现都要解决个痛点,我想下面这这种不方便的操作经常有人写吧。
假如Car
类是数据库映射类:
package cn.felord.mapstruct.entity;
import lombok.Data;
/**
* Car
**/
@Data
public class Car {
private String make;
private int numberOfSeats;
private CarType type;
}
CarType
类:
package cn.felord.mapstruct.entity;
import lombok.Data;
/**
* CarType
**/
@Data
public class CarType {
private String type;
}
CarDTO
是DTO类:
package cn.felord.mapstruct.entity;
import lombok.Data;
/**
* CarDTO
**/
@Data
public class CarDTO {
private String make;
private int seatCount;
private String type;
}
我们从数据库查询Car
然后需要转换为CarDTO
,通常我们会这么写一个方法进行转换:
public CarDTO carToCarDTO(Car car) {
CarDTO carDTO = new CarDTO();
carDTO.setMake(car.getMake());
carDTO.setSeatCount(car.getNumberOfSeats());
carDTO.setType(car.getCarType().getType());
// 有可能更长
return carDTO;
}
这种写法非常繁琐无味,而且没有技术含量。甚至中间还牵涉了很多类型转换,嵌套之类的繁琐操作,而我们想要的只是建立它们之间的映射关系而已。有没有一种通用的映射工具来帮我们搞定这一切。当然有而且还不少。有人说apache的BeanUtil.copyProperties
可以实现,但是性能差而且容易出异常,很多规范严禁使用这种途径。以下是对几种对象映射框架的对比,大多数情况下 MapStruct
性能最高。原理类似于lombok
,MapStruct
都是在编译期进行实现,而且基于Getter
、Setter
,没有使用反射所以一般不存在运行时性能问题。
今天就搞一搞MapStruct, 并跟Spring Boot 2.x 集成以下。 无论是idea 还是eclipse 都建议安装 MapStruct Plugin 插件,当然不安装也是可以的。