Java实体类之间的转换

一.为什么要转换实体类

通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储。

二.怎么转换

使用的BeanUtils.copyProperties方法虽然可以实现转换,但是比较粗暴,不仅效率低下(使用反射)而且仅映射相同名的属性,多数情况下还需要手动编写对应的转换方法实现。插件MapStruct 以接口方法结合注解优雅实现对象转换,MapStruct生成器生成代码以更贴近原生的Setter、Getter方法处理属性映射更为高效。

三.MapStruct的使用

如下示例:

实体类User:

java 复制代码
@Data
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
    private String address;
}

转换后的类UserVO:

java 复制代码
@Data
public class UserVO {
    private String userName;
    private int age;
}

转换接口:

java 复制代码
@Mapper
public interface UserConvert {
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
    @Mapping(source = "name", target = "userName")
    UserVO toVO(User entity);
}

使用方法:

java 复制代码
@Test
public void contextLoads() {
    User user = new User(0, "Test", 1, "成都高新区");
    UserVO userVO = UserConvert.INSTANCE.toVO(user);
}

如果有多个字段需要转换的话,使用@mappings注解,如下:

java 复制代码
@Mapper
public interface UserConvert {
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
    @Mappings({
            @Mapping(source = "name", target = "userName"),
            @Mapping(target = "age", target = "age")")
    })
    UserVO toVO(User entity);
}
相关推荐
艾莉丝努力练剑2 小时前
【C++:异常】C++ 异常处理完全指南:从理论到实践,深入理解栈展开与最佳实践
java·开发语言·c++·安全·c++11
武子康2 小时前
Java-184 缓存实战:本地缓存 vs 分布式缓存(含 Guava/Redis 7.2)
java·redis·分布式·缓存·微服务·guava·本地缓存
小马爱打代码8 小时前
Spring Boot:模块化实战 - 保持清晰架构
java·spring boot·架构
岁忧8 小时前
GoLang五种字符串拼接方式详解
开发语言·爬虫·golang
tyatyatya8 小时前
MATLAB基础数据类型教程:数值型/字符型/逻辑型/结构体/元胞数组全解析
开发语言·matlab
小坏讲微服务8 小时前
SpringBoot4.0整合knife4j 在线文档完整使用
java·spring cloud·在线文档·knife4j·文档·接口文档·swagger-ui
8***Z898 小时前
springboot 异步操作
java·spring boot·mybatis
i***13248 小时前
Spring BOOT 启动参数
java·spring boot·后端
坚持不懈的大白8 小时前
后端:SpringMVC
java
IT_Octopus8 小时前
(旧)Spring Securit 实现JWT token认证(多平台登录&部分鉴权)
java·后端·spring