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 映射接口实现对象之间的属性映射。