整合 Mapstruct 简化属性映射

整合 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 启用注解处理器

  1. 打开 IntelliJ IDEA,并加载你的项目。

  2. 打开 File -> Settings (或 Preferences)

  3. 在左侧导航栏中选择 Build, Execution, Deployment -> Compiler -> Annotation Processors

  4. 勾选 Enable annotation processing

  5. Store generated sources relative to 下拉列表中选择 Module content root

  6. 点击右下角 Apply 按钮应用设置,然后,点击 ok 按钮关闭弹框。

    在这里插入图片描述

4.2添加MapStruct插件

虽然这不是必需的,但 MapStruct 插件可以为你提供一些很有用的功能,例如代码提示和自动补全。

  1. 打开 File -> Settings (或 Preferences)
  2. 在左侧选择 Plugins
  3. 在市场 (Marketplace) 中搜索 “MapStruct” 并安装它。
  4. 重启 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 字段设置一下值即可

猜你喜欢

转载自blog.csdn.net/2302_77276867/article/details/143254700
今日推荐