在之前章节的例子中,我们在接收参数的时候都是使用的 User 类对象,这是一个 DO 对象,是用于与数据库进行交互的,而不是用于与前端业务进行交互的,所以需要创建一个 BO 业务对象用来与前端业务进行交互,保证数据隔离性及安全性。
接收参数换成了 BO 对象,但数据入库使用的是 DO 对象,这中间就需要将 BO 对象的属性复制到 DO 对象,然后代码里就会出现大量的 do.set(bo.get()),这让代码显得臃肿,繁琐。当然,通过反射或者是使用 Spring 提供的 BeanUtils.copyProperties() 等方法也可以达到简化代码的效果,但是在效率方面不尽如人意。
而 MapStruct 则提供了一种高效的解决方案,其实现方式是在编译期,自动生成相关的 do.set(bo.get()) 代码,所以,在运行期实际上就是直接调用原生的get/set 方法。
相关知识
MapStruct官网:http://mapstruct.org
课程目标
SpringBoot 整合 MapStruce 以及 Lombok
操作步骤
本文使用 Idea 集成开发环境
环境准备
安装 MapStruce 插件
File -> settings,打开 Idea 的设置界面,从左侧栏选择 Plugins 选项,再在右侧查询 MapStruce,点击安装。
设置IDE
File -> Settings 打开设置界面,
选择 Build,Execution,Deployment -> Compiler -> Annotation Processors 进入设置界面,
勾选 enable annotation processing
添加依赖
添加 mapstruct 的依赖
同时整合 Lombok,添加对 Lombok 的依赖
添加 mapstruct 的插件依赖,同时配置 Lombok
编码
编写 DTO 类,用于接收前端入参
编写 Mappering 转换器
- 类上添加 @Mapper 注解,用于项目启动时自动加载
- 方法上添加 @Mapping 注解,用于设置转换规则,source 设置源对象属性,target 设置目标对象属性,如果源对象属性名与目标对象属性名一致,则无需设置,在本例中,我们需要将 UserBO 对象的 mobile 属性复制至 User 对象的 name 属性中
- 设置常量 INSTANCE,用于其它方法调用,也可以通过 Spring 的 IOC 进行注入
编写 controller 接口
源码地址
本章源码 : https://github.com/caiyuanzi-song/boot.git
总结
MapStruct 释放掉大量的属性复制的代码,改为编译时自动生成,所以只是精简了项目代码。
注意
项目编译后,UserMapper 接口会在 target 目录的相应路径下生成一个 class 实现类,通过查看该实现类,可以看到实际生成的代码结构。但是,在编码过程中,如果修改了 UserMapper 接口内容,Idea 有时并不会重新编译,导致最新的修改无法生效,必须得先对项目执行一次 clean 操作,清除掉 class 实现类,再次启动时就会重新编译。