整合 Mapstruct : 简化属性映射
解决问题:当一个对象属性过多时,DO转VO需要写的字段太多了
1. 什么是 MapStruct?
MapStruct 是一个用于简化 Java Bean 映射代码的代码生成器。它可以自动生成在不同 Java 对象之间进行映射的代码,而无需手动编写复杂的转换逻辑。MapStruct 使得在 Java 应用程序中进行对象映射变得更加简单、高效、可维护。
2. 为什么要使用 MapStruct?
- 简化映射过程: 传统的 Java 对象映射需要编写大量的重复、繁琐的代码。MapStruct 自动生成这些映射代码,节省了开发人员的时间和精力。
- 类型安全性: MapStruct 是基于编译时的代码生成,因此提供了类型安全性。在编译时,它会检查源对象和目标对象的类型,避免了运行时的类型错误。
- 高性能: 由于 MapStruct 生成的代码是高度优化的,所以性能非常好。相比手动编写的映射代码,MapStruct 生成的代码更加高效。
- 可维护性: 当数据模型发生变化时,手动更新映射代码可能会非常麻烦。MapStruct 能够根据最新的数据模型自动生成新的映射代码,确保映射逻辑与数据模型保持同步。
- 灵活性: MapStruct 提供了丰富的配置选项和扩展点,可以满足各种复杂映射场景的需求。你可以定制生成的代码,以适应特定的业务逻辑。
3. 添加依赖
多模块中,在父工程模块的pom.xm下
<!-- 版本号统一管理 -->
<properties>
// 省略...
<mapstruct.version>1.5.5.Final</mapstruct.version>
</properties>
<!-- 统一依赖管理 -->
<dependencyManagement>
<dependencies>
// 省略...
<!-- Mapstruct 属性映射 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${
mapstruct.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 统一插件管理 -->
<pluginManagement>
<plugins>
// 省略...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${
java.version}</source> <!-- 根据你的 JDK 版本进行调整 -->
<target>${
java.version}</target> <!-- 根据你的 JDK 版本进行调整 -->
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${
lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${
mapstruct.version}</version> <!-- 使用时请检查最新版本 -->
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
在需要使用的模块中添加
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
在入口模块添加编译插件:
<build>
<plugins>
// 省略...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
4. IDEA 配置 Mapstruct
添加好了 MapStruct 依赖后,已经可以确保项目中能够正常使用 MapStruct 了。但是,为了在开发过程中获得更好的体验,我们可以为 IDE 进行一些配置,从而支持 MapStruct 的自动代码生成、代码提示等功能。
4.1 启用注解处理器
-
打开 IntelliJ IDEA,并加载你的项目。
-
打开
File -> Settings (或 Preferences)
。 -
在左侧导航栏中选择
Build, Execution, Deployment -> Compiler -> Annotation Processors
。 -
勾选
Enable annotation processing
。 -
在
Store generated sources relative to
下拉列表中选择Module content root
。 -
点击右下角
Apply
按钮应用设置,然后,点击ok
按钮关闭弹框。
4.2添加MapStruct插件
虽然这不是必需的,但 MapStruct 插件可以为你提供一些很有用的功能,例如代码提示和自动补全。
- 打开
File -> Settings (或 Preferences)
。 - 在左侧选择
Plugins
。 - 在市场 (Marketplace) 中搜索 “MapStruct” 并安装它。
- 重启 IntelliJ IDEA。
5. 添加 convert 接口
新建一个 /convert
包,并创建一个 BlogSettingsConvert
转换接口,代码如下:
@Mapper
public interface BlogSettingsConvert {
/**
* 初始化 convert 实例
*/
BlogSettingsConvert INSTANCE = Mappers.getMapper(BlogSettingsConvert.class);
/**
* 将 VO 转化为 DO
* @param bean
* @return
*/
BlogSettingsDO convertVO2DO(UpdateBlogSettingsReqVO bean);
}
注意,接口类上添加的 @Mapper
注解,导入自 org.mapstruct.Mapper
, 别搞错了哦。
6. 使用 Mapstruct 来转换
@Service
public class AdminBlogSettingsServiceImpl extends ServiceImpl<BlogSettingsMapper, BlogSettingsDO> implements AdminBlogSettingsService {
@Override
public Response updateBlogSettings(UpdateBlogSettingsReqVO updateBlogSettingsReqVO) {
// VO 转 DO
BlogSettingsDO blogSettingsDO = BlogSettingsConvert.INSTANCE.convertVO2DO(updateBlogSettingsReqVO);
blogSettingsDO.setId(1L);
// 保存或更新(当数据库中存在 ID 为 1 的记录时,则执行更新操作,否则执行插入操作)
saveOrUpdate(blogSettingsDO);
return Response.success();
}
}
ingsDO.setId(1L);
// 保存或更新(当数据库中存在 ID 为 1 的记录时,则执行更新操作,否则执行插入操作)
saveOrUpdate(blogSettingsDO);
return Response.success();
}
}
将 VO
类转换为了 DO
类,仅需要对 VO
中没有值的字段,如 ID
字段设置一下值即可