背景
在java的web开发中,pojo转换难以避免,mapstruct工具帮我们进行了简化,本wiki将进行实践。
实践过程
简易实践
创建一个hello项目(最简单的maven项目即可)。
pom文件添加依赖
<properties>
<mapstruct.version>1.3.1.Final</mapstruct.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
添加一个实体类Car
public class Car {
private String make;
private int numberOfSeats;
private CarType type;
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public int getNumberOfSeats() {
return numberOfSeats;
}
public void setNumberOfSeats(int numberOfSeats) {
this.numberOfSeats = numberOfSeats;
}
public CarType getType() {
return type;
}
public void setType(CarType type) {
this.type = type;
}
}
添加一个CarType的enum类
public enum CarType {
/**
*
*/
ONE
}
添加一个CarDto实体类
public class CarDto {
private String make;
private int seatCount;
private String type;
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public int getSeatCount() {
return seatCount;
}
public void setSeatCount(int seatCount) {
this.seatCount = seatCount;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
下面我希望直接能进行Car到CarDto的转化,那么就写一个Mapper
@Mapper
public interface CarMapper {
@Mappings({
@Mapping(source = "numberOfSeats", target = "seatCount")
})
CarDto carToCarDto(Car car);
}
由于make变量在Car和CarDto里面是一样的,所以并不需要特殊设置,就可以直接进行copy。
下面在Main里面进行一下测试。
public static void main(String[] args) {
System.out.println("hello");
Car car = new Car();
car.setMake("make");
car.setNumberOfSeats(2);
car.setType(CarType.ONE);
System.out.println(car);
System.out.println(CarMapper.INSTANCE.carToCarDto(car));
}
可以正常进行转换。
重点分析
转换的本质是,mapStruct进行了转换代码生成(注意,这里并没有使用反射,所以调用速度会很快)
评价
- 使用mapStruct能提高开发效率,不必再去写pojo的具体转换,但是需要先了解一下mapStruct本身
- 使用了代码生成的方式,而不是用反射,调用效率等同于自己写的转换