问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用MapStruct的@Mapper注解实现实体类间的相互转换

创作时间:
作者:
@小白创作中心

使用MapStruct的@Mapper注解实现实体类间的相互转换

引用
CSDN
1.
https://blog.csdn.net/m0_56666971/article/details/141337601

在Java开发中,实体类之间的转换是一个常见的需求。传统的转换方式往往繁琐且容易出错。本文将介绍如何使用MapStruct工具简化实体类之间的转换过程,通过具体的代码示例,展示如何使用@Mapper注解实现高效、便捷的转换。

一、背景

在日常项目开发中,常常需要将POJO(Plain Old Java Object)、PO(Persistent Object)等转换成DTO(Data Transfer Object)或VO(View Object)等情况。传统的做法是通过new一个目标对象,然后通过getter和setter方法读取和写入成员变量值,这种方式不仅笨拙,而且容易出错。

而MapStruct提供的@Mapper注解恰好可以解决这个问题,它能够自动生成实体类之间的转换代码,大大提高了开发效率。

二、简单使用

1. 引入依赖

首先需要在项目中引入MapStruct的相关依赖:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.4.2.Final</version>
    <scope>provided</scope>
</dependency>

2. 定义通用接口

接下来,为需要相互转换的实体类定义一个Mapper接口:

@Mapper(componentModel = "spring", uses = {}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper extends EntityMapper<UserDTO, User> {
}

其中,EntityMapper是一个通用的映射接口,定义了基本的转换方法:

public interface EntityMapper<D, E> {
    /**
     * DTO转Entity
     */
    E toEntity(D dto);
    /**
     * Entity转DTO
     */
    D toDto(E entity);
    /**
     * DTO集合转Entity集合
     */
    List<E> toEntity(List<D> dtoList);
    /**
     * Entity集合转DTO集合
     */
    List<D> toDto(List<E> entityList);
}

在项目启动后,Spring容器会自动注入UserMapper,并在target目录下生成具体的转换实现代码。

3. @Mapping注解

当两个实体类的字段命名不一致时,可以使用@Mapping注解进行针对性映射。例如:

@Mapper(componentModel = "spring")
public interface UserMapper {
    @Mapping(source = "userName", target = "name")
    UserDTO toDto(User user);
}

这样就可以将User类中的userName字段映射到UserDTO类的name字段。

三、总结

MapStruct提供了unmappedTargetPolicyunmappedSourcePolicy两个属性,用于处理未被映射的字段。这两个属性的设置将决定如何处理这些未被使用的源字段。使用的是ReportingPolicy枚举的几种方式:

  • IGNORE:忽略未在映射中使用的源字段,不会生成警告或错误。
  • WARN:生成警告,指示有未被使用的源字段。
  • ERROR:产生编译错误,阻止代码编译,直到这些未被使用的源字段得到处理。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号