前言
比较常用的几种JavaBean类型转换方式
- 手动转换 get、set 缺点:开发效率低
- json 效率低、不同属性名,复杂类型映射复杂
- 反射 性能低
- 字节码增强
…
几种转换工具的性能对比
简介
MapStruct是一个只需要定义接口、写少量注解就能实现两个不通类型之间的转换的工具,在编译期根据定义生成映射代码,生成的映射代码使用普通的方法调用,因此它非常快,且易懂,易Debug,支持Maven, Gradle等构建工具,且支持常用IDE。
总结:性能高、易懂、支持性好、易调试
使用
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</dependency>
**注:**在和Lombok1.18.16+共存时,需要加build插件指定Processor的顺序
<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>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
<!-- This is needed when using Lombok 1.18.16 and above -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<!-- Mapstruct should follow the lombok path(s) -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
实战
- 简单示例
- 自定义属性映射关系
/**
* 不同属性名映射
* @param userDTO1
* @return
*/
@Mapping(target = "name",source = "userName")
User map2(UserDTO1 userDTO1);
- 时间、数字与字符串之间的转换以及格式化
/**
* 浮点数格式化
* @param userDTO1
* @return
*/
@Mapping(target = "tall",numberFormat = "0.00")
User map3(UserDTO1 userDTO1);
/**
* 日期格式化
* @param userDTO1
* @return
*/
@Mapping(target = "birthday",dateFormat = "yyyy-mm-dd HH:mm:ss")
User map4(UserDTO1 userDTO1);
- 多级嵌套、集合类型转换
/**
* 多层嵌套
* @param userDTO1
* @return
*/
@Mapping(target = "school.name",source = "schoolName")
User map5(UserDTO1 userDTO1);
/**
* 集合转换
* @param userDTO1s
* @return
*/
List<User> userList2DtoList(List<UserDTO1> userDTO1s);
- 逆向转换
/**
* 逆向映射
* @param user
* @return
*/
@InheritInverseConfiguration(name = "map5")
UserDTO1 map6(User user);
- 多转一
/**
* 多转一
* @param school
* @return
*/
Student map8(User user,School school);
- 表达式
/**
* 表达式
* @param user
* @return
*/
@Mapping(target = "age",expression = "java(user.parseAge())")
UserDTO1 map9(User user);
- 复杂类型自定义转换
/**
* 复杂类型转换
*/
default UserDTO1 user2UserDto(User user){
UserDTO1 userDTO1 = new UserDTO1();
userDTO1.setId(user.getId().toString());
return userDTO1;
}
- 更新对象
/**
* 更新已有对象
*/
void update(School school,@MappingTarget User user);
- 通过uses引入外部转换
@Mapper(uses = DateUtil.class)
动态编译
JavaCompiler
AbstractProcessor#process