一、Mapstruct是什么?

Mapstruct和BeanUtil功能一样,都是两个实体类之间属性复制工具。
之前在开发项目的时候都是用的BeanUtils,听说过Mapstruct的大名但是没有使用过。最近来看看这个Mapstruct怎么玩?为什么那么快?

二、Mapstruct是怎么使用?

2.1导入依赖

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.5.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>

2.2使用

首先创建两个实体类Product,ProductV2

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    private Integer id;
    private String name;
    private BigDecimal price;
    private String pic;
    private Date createTime;
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    private Integer id;
    private String name;
    private BigDecimal price;
    private String pic;
    private Date createTime;
}

新建类型转换接口:

package com.unfbx.eventTest.mapstruct;

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface ProductMapStruct {
    ProductMapStruct instance = Mappers.getMapper(ProductMapStruct.class);

    ProductV2 ProductToProductV2(Product product);
}

新建测试类:

package com.unfbx.eventTest.mapstruct;

import java.math.BigDecimal;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Product product = new Product(1000,"耳机",new BigDecimal(10.50),"a.png",new Date());
        ProductV2 productV2 = ProductMapStruct.instance.ProductToProductV2(product);
        System.out.println(product);
        System.out.println(productV2);
    }
}

控制台输出

Product(id=1000, name=耳机, price=10.5, pic=a.png, createTime=Sun Jan 29 16:06:36 GMT+08:00 2023)
ProductV2(id=1000, name=耳机, price=10.5, pic=a.png, createTime=Sun Jan 29 16:06:36 GMT+08:00 2023)

三、Mapstruct为什么那么快?

查看编译后的class文件可以看到,类型转换接口在编译后会默认有一个实现类:
ProductMapStructImpl

package com.unfbx.eventTest.mapstruct;

import com.unfbx.eventTest.mapstruct.ProductV2.ProductV2Builder;

public class ProductMapStructImpl implements ProductMapStruct {
    public ProductMapStructImpl() {
    }

    public ProductV2 ProductToProductV2(Product product) {
        if (product == null) {
            return null;
        } else {
            ProductV2Builder productV2 = ProductV2.builder();
            productV2.id(product.getId());
            productV2.name(product.getName());
            productV2.price(product.getPrice());
            productV2.pic(product.getPic());
            productV2.createTime(product.getCreateTime());
            return productV2.build();
        }
    }
}

里面做的就是属性映射。所有相较于BeanUtils的反射机制,肯定是这种方案会更加快。

文章目录