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

一、背景

在日常项目开发中中,常常需要将pojo、po等转成dto或者vo等情况,正常我们的做法是通过new一个目标对象,通过getter、setter用于读取和写入成员变量值,但是这种方式有点笨拙。

而MapStruct方法的@Mapper恰好就提供了一个便捷转换实体类的功能,提供开发效率。

二、简单使用

1、首先,引入对应的依赖

		<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接口调用,,项目启动后,将UserMapper注入Spring容器后,注解会在target文件夹中自动生成对应字段的getter、setter方法,避免了大量重复的功能。

@Mapper(componentModel = "spring", uses = {}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper extends EntityMapper<UserDTO, User> {
}
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);
}

在target文件夹自动生成的代码如下

3、@Mapping注解

当要相互转换的两个实体类间的代码命名不同时,可以使用改@Mapping注解针对性的进行映射。例如下图

三、总结

顺带讲一下注解中的unmappedTargetPolicy 和unmappedSourcePolicy 这两个属性的区别,前者针对的是目标对象的字段,后者针对的是源对象中的字段,这两个属性的设置将决定如何处理这些未被使用的源字段。使用的是ReportingPolicy枚举的几种方式:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值