还在使用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中自动生成我们定义的接口的实现类,如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210506095731785.png
这个实现类是java自动生成,如果有兴趣的同学可以去编译,然后看看Java是怎么实现的


如下是我们项目中的实际使用
定义接口
在这里插入图片描述
使用接口
在这里插入图片描述

----我是“道祖且长”,一个在互联网“苟且偷生”的Java程序员

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三七有脾气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值