网站首页 > 博客文章 正文
Java日常开发中经常涉及到各种对象的转换,如:VO、DO、DTO等,我们经常会借助工具来转换对象以减轻工作量、提升工作效率,如Apache的BeanUtils,Spring的BeanUtils、Cglib的BeanCopier、阿里的FastJson等,
本篇介绍另一个高性能的对象转换工具:MapStruct。
1、MapStruct简介
MapStruct是一个生成类型安全、高性能且无依赖的JavaBean映射代码的注解处理器。
官网: https://mapstruct.org/
github: https://github.com/mapstruct/mapstruct
2、MapStruct使用
2.1、引入依赖
<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>
和lombok一起使用的话,需要注意lombok的版本,否则可能出现问题, 如编译后的实现类未进行get set处理。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
使用Idea的话,开启注解处理:
File->Settings->Build,Execulion,Development->Complier->Annotation Processors
勾选Enable annotation processing
2.2、定义需要转换的类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Person {
private Long id;
private String name;
private Integer age;
private String email;
private Date birthday;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class PersonDTO {
private Long id;
private String name;
private Integer age;
private String email;
/**
* 与 Person 的 birthDay 不一致
*/
private Date birth;
/**
* 对 Person 的birthDay进行拓展, dateFormat的形式
*/
private String birthDateFormat;
}
2.3、定义映射类
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mappings({
@Mapping(source = "birthday", target = "birth"),
@Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(target = "email", ignore = true)
})
PersonDTO convert(Person person);
}
@Mapper 只有在接口加上这个注解, MapStruct才会去实现该接口
@Mapper 里有个 componentModel 属性,主要是指定实现类的类型,一般用到两个:
default:默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象
spring:在接口的实现类上自动添加注解 @Component,可通过 @Autowired 方式注入
@Mapping:属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性
source:源属性
target:目标属性
dateFormat:String到Date日期之间相互转换,通过SimpleDateFormat进行日期格式化
ignore: 忽略这个字段
@Mappings:配置多个@Mapping
代码编译后,我们可以在target下看到自动生成的实现类PersonMapperImpl:
public class PersonMapperImpl implements PersonMapper {
@Override
public PersonDTO convert(Person person) {
if ( person == null ) {
return null;
}
PersonDTO personDTO = new PersonDTO();
personDTO.setBirth( person.getBirthday() );
if ( person.getBirthday() != null ) {
personDTO.setBirthDateFormat( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( person.getBirthday() ) );
}
personDTO.setId( person.getId() );
personDTO.setName( person.getName() );
return personDTO;
}
}
2.4、测试
public class PersonMapperImpl implements PersonMapper {
@Override
public PersonDTO convert(Person person) {
if ( person == null ) {
return null;
}
PersonDTO personDTO = new PersonDTO();
personDTO.setBirth( person.getBirthday() );
if ( person.getBirthday() != null ) {
personDTO.setBirthDateFormat( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( person.getBirthday() ) );
}
personDTO.setId( person.getId() );
personDTO.setName( person.getName() );
return personDTO;
}
}
2.5、交由Spring管理
添加spring相关依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
新增转换类PersonMapperSpring,@Mapper注解componentModel属性改为spring;
@Mapper(componentModel = "spring")
public interface PersonMapperSpring {
@Mappings({
@Mapping(source = "birthday", target = "birth"),
@Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(target = "email", ignore = true)
})
PersonDTO convert(Person person);
}
测试:
@Configuration
@ComponentScan(value = "cn.river.mapstruct")
public class PersonConverterSpringTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(PersonConverterSpringTest.class);
Person person = new Person(1L, "river106", "xxx@gmail.com", new Date());
PersonMapperSpring bean = context.getBean(PersonMapperSpring.class);
PersonDTO personDTO = bean.convert(person);
System.out.println(personDTO);
}
}
3、和其他转换工具性能对比
使用如上简单对象,转换1000000次结果如下(时间单位:毫秒):
fastjson :2862
springBeanUtils :495
beanCopier :122
mapstruct :16
从测试结果来看,MapStruct转换性能是最好的。
原文链接:https://river106.cn/posts/b220ce52.html
猜你喜欢
- 2024-12-20 【推荐】IntelliJ IDEA 使用系列教程(21)-配置篇-配置 Git
- 2024-12-20 Java注解详解以及如何实现自定义注解
- 2024-12-20 IDEA下载及安装教程(24年7月更新)
- 2024-12-20 开发、改Bug速度快10倍!只要掌握 IDEA 这30个Debug小技巧
- 2024-12-20 9个服务端提升debug效率的IDEA Debugger技巧
- 2024-12-20 Goland (IDEA)杀手级插件,不用再手写GORM代码,解放双手可摸鱼
- 2024-12-20 开源|一款很强的 IntelliJ IDEA 的插件
- 2024-12-20 【推荐】一款 IDEA 必备的 JSON 处理工具插件 — Json Assistant
- 2024-12-20 IDEA 2024.3 预览:把开发者感动到哭了
- 2024-12-20 5分钟解决 IntelliJ IDEA 使用问题(免费激活至 2100 年)
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 355℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 344℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)