初识Java对象转换工具MapStruct(java 对象转换)
MapStruct解决的问题
在java分层架构中,会出现很多的POJO对象,如DO/DTO/BO/VO,在同一业务不同分层中的传输,或者不同业务中传输,常常需要相互转换。通常情况下,代码中需要大量的 convert类来实现不同领域中对象的转换,而MapStruct可以动态生成代码,来达到不同对象中的转换,而且还支持自定义转换。
DO(Data Object)对象
与数据库表结构一致的类结构,通过DAO层向上传递对象
BO(Business Object)业务对象
封装对象,复杂对象,用于服务层(Manager层)内部调用的对象。可以做业务运算。
DTO(Data Transfer Object)数据传输对象
前端(视图层)调用时传输。
VO 展示层对象
通常由DTO转换而成,而且两者的字段大多数时候是一致的。
一般情况下,DO转DTO,DTO转VO ,VO转DTO、DTO转DO
废话不多说,直接上代码。
Pom.xml
引入依赖,项目配置
mapstruct引入
<properties>
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
maven插件配置
这是动态生成代码的关键
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- depending on your project -->
<target>1.8</target> <!-- depending on your project -->
<annotationProcessorPaths>
<!--使用lombok的需要配置,不使用的,可以不用配置-->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
编写DO类
假设数据库中有一张user表,然后有字段user_name、phone、setting、create_time等
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String userName;
private String phone;
private String setting;
private Date createTime;
}
编写DTO类
假设dto对象中createTime字段需要的是时间戳
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserDto {
private String userName;
private String phone;
private Long createTime;
}
编写转换类Convert
@Mapper 是MapStruct提供的注解,@Mapping指定转换的方式。
@Mapper
public interface UserConvert {
UserConvert INSTANCE = Mappers.getMapper( UserConvert.class );
@Mapping(target = "createTime", expression = "java(user.getCreateTime().getTime())")
UserDto userToUserDto(User user);
}
编译
编译完成后,会对UserConvert生成其实现类,在target目录中,如下:
public class UserConvertImpl implements UserConvert {
public UserConvertImpl() {
}
public UserDto userToUserDto(User user) {
if (user == null) {
return null;
} else {
UserDto userDto = new UserDto();
userDto.setUserName(user.getUserName());
userDto.setPhone(user.getPhone());
userDto.setCreateTime(user.getCreateTime().getTime());
return userDto;
}
}
}
测试使用
public static void main(String[] args) {
User user = new User("name", "18899999999", "{}", new Date());
UserDto userDto = UserConvert.INSTANCE.userToUserDto(user);
System.out.println(userDto);
}
代码输出
UserDto(userName=name, phone=18899999999, createTime=1638076270281)
说明我们的转换生效了。
总结
- 本文只是入门学习了MapStruct,需要进一步学习的同学可以到MapStruct中学习,链接:https://mapstruct.org/
- 优点是:代码简洁,可以方便快速避免很多重复的代码。有的时候getter/setter多了会导致手误把属性复制错,这样就不会有这种问题。
本文对MapStruct进行了简单的介绍,如果有不对的地方,还请读者指出。