前序:
之前为了规范化,从数据库查询出来之后,有些属性不需要传递,需要定义与之对应的DTO,可能有时候DTO中与PO中的属性名称还不一样的情况,这个时候就不能使用BeanUtils.copy了,而且每次查询每次都要写一个BeanUtils.copy,可能还有的公司并不相信BeanUtils.copy(这里包括全部公司的copy,apache、spring、cglib等),认为会有问题(我之前公司有个开发就不用,全是手动转换DTO,具体什么问题我也没遇到…),这里多说一句,BeanUtils.copy性能最快的是cglib的,本人亲测过,手动调用setXxx方法最慢,有兴趣的可以看我另外一篇博客:
java拷贝对象属性的几种方式对比
最近突然发现有一个框架,可以实现这种繁琐的操作,不需要自己转来转去,而且可以重复使用,就是mapstruct这个框架,你只需要简单的创建一个接口类,配个注解,再写个转换接口方法就可以了,简直不能再舒服了。
第一步、导依赖
<!--包含一些核心的注解-->
<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>
<scope>compile</scope>
</dependency>
第二步、定义2个测试类
package com.example.demo.mapstruct;
import lombok.Data;
/**
* @Author: Lee
* @Date: 2020/5/13
* @Description:
**/
@Data
public class Car {
private String make;
private int numberOfSeats;
private CarType type;
//constructor, getters, setters etc.
static enum CarType {
SEDAN
}
}
package com.example.demo.mapstruct;
import lombok.Data;
/**
* @Author: Lee
* @Date: 2020/5/13
* @Description:
**/
@Data
public class CarDTO {
private String make;
private int seatCount;
private String type;
}
第三步、创建接口
package com.example.demo.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* @Author: Lee
* @Date: 2020/5/13
* @Description:
**/
@Mapper
public interface CarTransfer {
/**
* 定义个变量,用于获取CarTransfer接口的实现,格式固定如下:
*/
CarTransfer INSTANCE = Mappers.getMapper(CarTransfer.class);
/**
* 当2个类中的字段名不一致时,可以 @Mapping注解来解决,
* source代表源对象中的类,target代表目标
*/
@Mappings(@Mapping(source = "numberOfSeats", target = "seatCount"))
CarDTO toCarDTO(Car car);
}
第四步、验证
package com.example.demo.mapstruct;
/**
* @Author: Lee
* @Date: 2020/5/13
* @Description:
**/
public class Test1 {
public static void main(String[] args) {
Car car = new Car();
car.setMake("car");
car.setNumberOfSeats(1);
car.setType(Car.CarType.SEDAN);
CarDTO carDTO = CarTransfer.INSTANCE.toCarDTO(car);
System.out.println(carDTO);
}
}
结果如下:
总结:
是不是很方便,用了之后,你就会发现很舒服的,而且会自动对不同的字段类型进行转换,依赖的版本可以自己选择。