背景
随着软件架构分层越来越多,那么各个层次之间的数据模型就要面临着相互转换的问题,典型的就是我们可以在代码中见到各种O,如DO、DTO、VO等。
一般情况下,同样一个数据模型,我们在不同的层次要使用不同的数据模型。如在数据存储层,我们使用DO来抽象一个业务实体;在业务逻辑层,我们使用DTO来表示数据传输对象;到了展示层,我们又把对象封装成VO来与前端进行交互。
这时为了避免大量set/get,和实体类相互转换的冗余代码出现,mapstruct框架应运而生
原理
在编译期,MapStruct就可以直接生成bean映射的代码,会自动生成一个xxMapperImpl,相当于代替我们写了很多setter和getter。因为在编译期做了很多事情,所以MapStruct在运行期的性能会很好,并且还有一个好处,那就是可以把问题的暴露提前到编译期,使得运行期的性能得到了大大的提升。
使用
导入依赖


示例

通常我们可以使用get/set等方式逐一进行字段映射操作,如:

但是,编写这样的映射代码是一项冗长且容易出错的任务。MapStruct等类似的框架的目标是通过自动化的方式尽可能多地简化这项工作。
编译后自动生成的实现类,根据注解自动生成方法
单转换

框架生成的impl

组合转换和集合转换

组合

集合

MyMetaObjectHandler 自动插入时间
SchedulerLock 数据库为基础做分布式锁