还在使用BeanUtils.copyProperties()? 来看看MapStruct,强大五倍
来杭州了,2021年4月26日入职新公司,接触的第一个项目就使用到了这个技术,挺新颖的,也挺好用的,效率也高,见猎心喜,遂有此博客
简介
MapStruct是满足JSR269规范的一个Java注解处理器,用于为Java Bean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。
您所要做的就是定义一个mapper接口(@Mapper),该接口用于声明所有必须的映射方法。在编译期间MapStruct会为该接口自动生成实现类。该实现类使用简单的Java方法调用来映射source-target对象,在此过程中没有反射或类似的行为发生。
性能
我们常用的实体类转换的方法是使用:BeanUtils.copyProperties(),这个方法相信所有的Java开发都不陌生吧,他就是使用的Spring,看上图可以看到,MapStruct比他快7,8倍,与getter/setter齐平。
使用方法
工程中引入 maven 依赖
<properties>
<mapstruct.version>1.2.0.Final</mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
定义两个实体类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Person {
private Long id;
private String name;
private String email;
private Date birthday;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private Long userId;
private String email;
private Date birth;
}
可以看到,相比较于Person实体,User实体的birth和userId,与Person实体的birthday和字段名称还不相同,一般情况下,就无法使用BeanUtil.copyProperties()方法了。如果使用MapStruct,就可以进行如下处理,定义如下接口:
@Mapper(componentModel = "spring")
public interface ApiMapper {
// ClassLoader 加载方式
ApiMapper INSTANCE = Mappers.getMapper(ApiMapper.class);
/**
* User 转 Person
* 只需要定义这个接口就可以,然后直接调用,不需要手动去实现
*/
@Mappings({
@Mapping(source = "birth", target = "birthday"),
@Mapping(source = "userId", target = "id")
})
Person userToPerson(User user);
}
然后如果有User转换为Person的业务场景,就可以这样使用:
Person person = ApiMapper.INSTANCE.userToPerson(user);
然后在编译的时候,就会通过 JSR 269 Java注解处理器在target中自动生成我们定义的接口的实现类,如下:
这个实现类是java自动生成,如果有兴趣的同学可以去编译,然后看看Java是怎么实现的
如下是我们项目中的实际使用
定义接口:
使用接口:
----我是“道祖且长”,一个在互联网“苟且偷生”的Java程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!