java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java MapStruct

Java中MapStruct入门使用及对比

作者:檀越剑指大厂

MapStruct是一个Java注解处理器框架,用于简化Java Bean之间的映射,本文主要介绍了Java中MapStruct入门使用及对比,感兴趣的可以了解一下

一.简单介绍

1.什么是 MapStruct?

MapStruct 是一个 Java 注解处理器框架,用于简化 Java Bean 之间的映射。它通过生成映射代码来消除手动编写映射代码的繁琐工作,从而提高开发效率。

2.MapStruct 的特点

二.基础使用

1.添加依赖

添加依赖: 首先,在你的项目中添加 MapStruct 的依赖。你可以在 Maven 或 Gradle 中进行配置。

Maven:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version> <!-- 使用最新版本 -->
</dependency>

Gradle:

implementation 'org.mapstruct:mapstruct:1.4.2.Final' // 使用最新版本
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'

2.定义映射接口

定义映射接口: 创建一个带有@Mapper注解的接口,定义映射方法。

@Mapper
public interface CarMapper {
    CarDto carToCarDto(Car car);
}

3.编写配置

编写映射配置: 如果需要自定义映射逻辑,可以在映射接口中定义自定义方法,或者使用@Mapping注解。

@Mapper
public interface CarMapper {
    @Mapping(source = "make", target = "manufacturer")
    CarDto carToCarDto(Car car);
}

4.生成代码

生成映射代码: 编译项目时,MapStruct 注解处理器将生成映射代码。

5.调用方法

调用映射方法: 在应用程序中调用生成的映射方法。

CarMapper carMapper = Mappers.getMapper(CarMapper.class);
CarDto carDto = carMapper.carToCarDto(car);

以上是 MapStruct 的基本介绍和使用步骤。通过这些步骤,你可以轻松地实现 Java Bean 之间的映射,同时保持代码的简洁和易维护性。

三.封装使用

1.FromConverter

public interface FromConverter<T, FROM> {

    T from(FROM from);

    List<T> from(List<FROM> list);

    default PageBean<T> from(PageBean<FROM> page) {
        PageBean<T> result = new PageBean<>();
        result.setTotalElements(page.getTotalElements());
        result.setNumber(page.getNumber());
        result.setSize(page.getSize());
        result.setTotalPages(page.getTotalPages());
        result.setNumberOfElements(page.getNumberOfElements());
        result.setContent(this.from(page.getContent()));
        return result;
    }

    default PageBean<T> from(IPage<FROM> page) {
        PageBean<T> result = new PageBean<>();
        result.setTotalElements((int) page.getTotal());
        result.setNumber((int) page.getCurrent());
        result.setSize((int) page.getSize());
        result.setTotalPages((int) page.getPages());
        result.setNumberOfElements(page.getRecords().size());
        result.setContent(this.from(page.getRecords()));
        return result;
    }
}

2.PropertyCopier

public interface PropertyCopier<TARGET, T> {
    void copy(@MappingTarget TARGET target, T t);
}

3.ToConverter

public interface ToConverter<T, TO> {
    TO to(T t);

    List<TO> to(List<T> list);

    default PageBean<TO> to(PageBean<T> page) {
        PageBean<TO> result = new PageBean<>();
        result.setTotalElements(page.getTotalElements());
        result.setNumber(page.getNumber());
        result.setSize(page.getSize());
        result.setTotalPages(page.getTotalPages());
        result.setNumberOfElements(page.getNumberOfElements());
        result.setContent(this.to(page.getContent()));
        return result;
    }

    default PageBean<TO> to(IPage<T> page) {
        PageBean<TO> result = new PageBean<>();
        result.setTotalElements((int) page.getTotal());
        result.setNumber((int) page.getCurrent());
        result.setSize((int) page.getSize());
        result.setTotalPages((int) page.getPages());
        result.setNumberOfElements(page.getRecords().size());
        result.setContent(this.to(page.getRecords()));
        return result;
    }
}

4.TwoWayConverter

public interface TwoWayConverter<SRC, DEST> extends ToConverter<SRC, DEST>, FromConverter<SRC, DEST> {
}

5.基本使用

@Data
public class ChatbotDTO {

    private Integer id;
    private String question;
    private String response;
    private Date createTime;
    private Integer isDelete;

    @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
    public interface Converter extends FromConverter<ChatbotDTO, Chatbot> {
        Converter INSTANCE = Mappers.getMapper(Converter.class);
    }
}
@Data
public class Chatbot extends Model<Chatbot> {
    private Integer id;
    private String question;
    private String response;
    private Date createTime;
    private Integer isDelete;
}

6.原理分析

打开 target 目录,可以看到如图所示的编译后生成的类,说明在编译器就生成了对应的 DTO,相比其他 2 种方式在运行时生成 DTO 更加高效。

7.使用技巧

四.工具对比

1.概述

MapStruct、Apache BeanUtils 以及 Spring BeanUtils 都是用于 Java Bean 之间属性复制的工具,但它们有一些区别,包括实现方式、性能、功能等方面。

2.MapStruct

优势:

不足:

3.Apache BeanUtils

优势:

不足:

4.Spring BeanUtils

优势:

不足:

5.总结:

选择使用哪个工具取决于你的具体需求,如果性能和类型安全性是关键考虑因素,而且你愿意付出一些学习成本,那么 MapStruct 可能是一个更好的选择。如果你需要一个简单且易于使用的解决方案,并且性能要求不是很高,那么 Apache BeanUtils 或 Spring BeanUtils 可能是更合适的选择。

到此这篇关于Java中MapStruct入门使用及对比的文章就介绍到这了,更多相关Java MapStruct内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文