news 2026/8/1 9:21:50

MapStruct 映射接口的概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MapStruct 映射接口的概念

MapStruct 映射接口的概念

在 Java 开发中,对象之间的映射是一个常见的需求,比如将实体对象(Entity)映射为数据传输对象(DTO)。手动编写映射代码会很繁琐且容易出错,尤其是当对象的属性较多时。MapStruct 是一个代码生成器,它基于约定优于配置的理念,通过定义映射接口来自动生成对象映射的实现代码。

MapStruct 映射接口就是开发者定义的一个 Java 接口,在这个接口中声明用于对象映射的抽象方法。MapStruct 在编译时会根据这些方法的定义生成对应的实现类,从而实现对象之间的属性映射。

使用步骤

以下详细介绍如何使用 MapStruct 映射接口,包含添加依赖、定义实体类、定义映射接口以及使用生成的映射器。

1. 添加依赖

如果你使用的是 Maven 项目,在pom.xml文件中添加以下依赖:

<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <!-- 使用最新版本 --> <version>1.5.5.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> <scope>provided</scope> </dependency>

如果你使用 Gradle 项目,在build.gradle文件中添加以下依赖:

implementation 'org.mapstruct:mapstruct:1.5.5.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
2. 定义实体类和 DTO 类

假设我们有一个User实体类和一个UserDTO数据传输对象类,代码如下:

// User 实体类 public class User { private String name; private int age; // 构造方法、Getter 和 Setter 方法 public User() {} public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // UserDTO 数据传输对象类 public class UserDTO { private String name; private int age; // 构造方法、Getter 和 Setter 方法 public UserDTO() {} public UserDTO(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3. 定义映射接口

创建一个映射接口UserMapper,使用@Mapper注解标记这个接口,MapStruct 会根据这个注解生成实现类。

import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @Mapper public interface UserMapper { // 创建一个单例的映射器实例 UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); // 定义映射方法,将 User 对象映射为 UserDTO 对象 UserDTO userToUserDTO(User user); }
4. 使用生成的映射器
public class Main { public static void main(String[] args) { // 创建一个 User 对象 User user = new User("John Doe", 30); // 使用 MapStruct 生成的映射器将 User 对象映射为 UserDTO 对象 UserDTO userDTO = UserMapper.INSTANCE.userToUserDTO(user); // 输出结果 System.out.println("Name: " + userDTO.getName()); System.out.println("Age: " + userDTO.getAge()); } }

解释

  • @Mapper注解:标记一个接口为映射接口,MapStruct 会在编译时为这个接口生成实现类。
  • Mappers.getMapper(Class<T> clazz)方法:用于获取映射接口的实例,通常将这个实例定义为静态常量。
  • 映射方法:在映射接口中定义的抽象方法,MapStruct 会根据方法的参数和返回类型自动生成映射逻辑。如果属性名和类型相同,会自动进行映射。

自定义映射规则

如果属性名或类型不同,可以使用@Mapping注解来指定映射规则。例如:

import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mapping(source = "name", target = "fullName") UserDTO userToUserDTO(User user); }

在这个例子中,User类的name属性会映射到UserDTO类的fullName属性。

通过以上步骤,你就可以使用 MapStruct 映射接口实现对象之间的属性映射。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 16:12:38

8MP 环视 / DMS 摄像头,带宽到底有多狠?

&#x1f697; 8MP 环视 / DMS 摄像头&#xff0c;带宽到底有多狠&#xff1f; ——你以为是摄像头的问题&#xff0c;其实是 MIPI 和 SerDes 在“扛雷”&#x1f525;很多人第一次做 DMS / 环视摄像头&#xff0c;都会掉进一个坑&#xff1a; “摄像头像素够高就行了&#xff…

作者头像 李华
网站建设 2026/8/1 10:38:18

银河距离银河距离银河距离银河距离银河距离

原文&#xff1a;towardsdatascience.com/how-far-are-we-from-alien-civilizations-part-4-of-the-drake-equation-series-2299ee009476?sourcecollection_archive---------2-----------------------#2024-09-08 我们距离外星文明有多远&#xff1f;&#xff08;德雷克方程系…

作者头像 李华
网站建设 2026/7/29 6:20:55

生成式深度学习(用变分自编码器生成图像)

用变分自编码器生成图像 目前最流行也是最成功的创造性人工智能应用就是图像生成&#xff1a;学习潜在视觉空间&#xff0c;并从空 间中进行采样来创造全新图片。这些图片是在真实图片中进行插值得到的&#xff0c;可以是想象中的人、 想象中的地方、想象中的猫和狗等。 本节和…

作者头像 李华
网站建设 2026/8/2 1:51:18

基于STM32的智能鞋柜系统设计与实现

基于STM32的智能鞋柜系统设计与实现 摘要 本文设计并实现了一种基于STM32F103C8T6单片机的智能鞋柜系统,该系统融合了环境感知、智能决策与远程控制技术,实现了鞋柜内部环境的全方位监测与调控。系统采用DHT11温湿度传感器、PM2.5粉尘传感器、MQ-135空气质量传感器构建多维…

作者头像 李华