Loading... ## 前言 MapStruct的作用是 **两个对象的属性进行拷贝**,这个工具的性能很高,值得学习并在项目中使用。Map是一种代码生成器,它极大地简化了基于”约定大于配置“方法的JavaBean类型之间的映射的实现。生成的映射代码使用纯方法调用,因此快速、类型安全易于理解。**还有诸如其他的工具比如:BeanUtils也可以用于对象属性拷贝,但是它是浅拷贝,在性能测试中没有MapStruct好。** ## 引入依赖 ```xml <dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.1.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-jdk8 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.4.1.Final</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <!--必须添加这个否则找不到转换接口实现类--> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.7.RELEASE</version> </plugin> </plugins> </build> ``` ## 具体使用: 假设我们有两个类需要互相转换,分别是User、UserDto,类定义如下: ### User ```java package com.example.demo.domain; import java.io.Serializable; /** * * @TableName user */ public class User implements Serializable { /** * 姓名 */ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } } ``` ### UserDto ```java package com.example.demo.Dto; /** * @code Description * @code author 本当迷 * @code date 2023/1/31-12:10 */ public class UserDto { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "UserDto{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'; } } ``` 然后我们需要定义一个转换接口 ### 定义User转换UserDto接口 ```java package com.example.demo.converter; import com.example.demo.Dto.UserDto; import com.example.demo.domain.User; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; /** * @code Description * @code author 本当迷 * @code date 2023/1/31-12:39 */ @Mapper public interface UserRoleMapper { /** * 获取该类自动生成的实现类的实例 * 接口中的属性都是 public static final 的 * 方法都是public abstract 的 */ UserRoleMapper INSTANCES = Mappers.getMapper(UserRoleMapper.class); /** * 这个方法就是用于实现对象属性复制的方法 * * @Mapping 用来定义属性复制规则 * source 指定源对象属性 * target 指定目标对象属性 * * @param user 这个参数就是源对象,也就是需要被复制的对象 * @return 返回的是目标对象,就是最终的结果对象 */ @Mappings({ @Mapping(source = "name", target = "username"), @Mapping(target = "password", source = "") }) UserDto do2dto(User user); } ``` ### 转换测试 ```java @Test void contextLoads() { final User user = new User(); user.setName("本当迷"); final UserDto userDto = UserRoleMapper.INSTANCES.do2dto(user); System.out.println("user DTO: " + userDto); } ``` ### 效果:  最后修改:2023 年 02 月 01 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。