使用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提供了unmappedTargetPolicy
和unmappedSourcePolicy
两个属性,用于处理未被映射的字段。这两个属性的设置将决定如何处理这些未被使用的源字段。使用的是ReportingPolicy
枚举的几种方式:
IGNORE
:忽略未在映射中使用的源字段,不会生成警告或错误。WARN
:生成警告,指示有未被使用的源字段。ERROR
:产生编译错误,阻止代码编译,直到这些未被使用的源字段得到处理。
热门推荐
苻坚与慕容冲的纠葛及其最终命运
女官不是皇帝的嫔妃,到底是干什么的呢?
探索心流的奥秘:如何达到专注的巅峰
手沖咖啡技巧大公開 - 職人分享必學秘訣
徐州文旅:从“网红”迈向“长红”的生动实践
散户必读:3分钟分清上证深证创业板指差异,选对赛道事半功倍
上证指数和深证成指:中国股市的两大重要指标
2025十大流行趋势一览!波西米亚风搭配骑士靴更迷人?这个风格突破5400%搜索
地球上两点间距离计算方法详解:平面近似、大圆路径与完全椭球公式
7个家居多功能设计方案,让小空间发挥大作用
一个月的猫应该吃什么粮?如何选择合适的猫粮?
2024环三峡自行车赛将启 赛事总里程达294.8公里
全程1214公里 2024环湖赛路线公布
木瓜:健脾消食·清热祛风
什么是夜光漂?夜光漂怎么发光的?夜光鱼漂怎么使用?
2025世界年|非遗春节③:闹花灯,流光溢彩的民俗记忆
备孕知识:二胎想生个女儿怎么科学备孕?
“秋吃根,赛人参”,一补肺润燥,二调养脾胃,三减脂,安稳度秋
【幼儿园大班绘本推荐】
解锁全球商业机遇:深入解读注册开曼群岛公司全攻略 - 从离岸架构到税务优化
什么是腥发食物?从传统认知到现代研究
梅花樱花桃花杏花梨花李花,傻傻分不清?
数十小时不间断训练!看战机围猎水下目标
Word中插入特殊符号的7种方法详解
如何从多维度评估投资绩效以全面衡量投资效果
电热毯事故频发,我们到底还能不能用电热毯了?
都是光纤,也有快慢之分?
中国正式向火星「发问」,“天问一号”火星探测器发射成功
断桥铝窗户纱窗哪种好,选择家居更安心
人的本命年是怎么算的