当前位置: 代码迷 >> 综合 >> SpringBoot2.0实战(7)整合MapStruct优雅地复制属性
  详细解决方案

SpringBoot2.0实战(7)整合MapStruct优雅地复制属性

热度:126   发布时间:2023-09-29 03:06:03.0

在之前章节的例子中,我们在接收参数的时候都是使用的 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 的依赖

SpringBoot2.0实战(7)整合MapStruct优雅地复制属性

同时整合 Lombok,添加对 Lombok 的依赖

SpringBoot2.0实战(7)整合MapStruct优雅地复制属性

添加 mapstruct 的插件依赖,同时配置 Lombok

SpringBoot2.0实战(7)整合MapStruct优雅地复制属性

编码

 

 

编写 DTO 类,用于接收前端入参

SpringBoot2.0实战(7)整合MapStruct优雅地复制属性

编写 Mappering 转换器

 

  • 类上添加 @Mapper 注解,用于项目启动时自动加载
  • 方法上添加 @Mapping 注解,用于设置转换规则,source 设置源对象属性,target 设置目标对象属性,如果源对象属性名与目标对象属性名一致,则无需设置,在本例中,我们需要将 UserBO 对象的 mobile 属性复制至 User 对象的 name 属性中
  • 设置常量 INSTANCE,用于其它方法调用,也可以通过 Spring 的 IOC 进行注入

SpringBoot2.0实战(7)整合MapStruct优雅地复制属性

编写 controller 接口

SpringBoot2.0实战(7)整合MapStruct优雅地复制属性

源码地址

本章源码 : https://github.com/caiyuanzi-song/boot.git

总结

MapStruct 释放掉大量的属性复制的代码,改为编译时自动生成,所以只是精简了项目代码。

注意

项目编译后,UserMapper 接口会在 target 目录的相应路径下生成一个 class 实现类,通过查看该实现类,可以看到实际生成的代码结构。但是,在编码过程中,如果修改了 UserMapper 接口内容,Idea 有时并不会重新编译,导致最新的修改无法生效,必须得先对项目执行一次 clean 操作,清除掉 class 实现类,再次启动时就会重新编译。

  相关解决方案