MapStruct工具类的使用

1.简介

MapStruct是一个代码生成器,它基于约定优于配置的原则,通过注解的方式,将Java bean对象之间进行属性拷贝。它避免了手动编写繁琐的getter/setter调用代码,大大提高了开发效率,并且生成的代码类型安全、性能高效。

2.作用

2.1 属性拷贝

MapStruct主要用于Java bean之间的属性拷贝。例如,您有一个用户信息的DTO(数据传输对象)和一个用户信息的实体类,这两个类之间有很多相同的属性。使用MapStruct,您可以定义一个Mapper接口,并通过注解指定源对象和目标对象,MapStruct会自动生成实现这个Mapper接口的代码,完成属性拷贝的工作。

2.2 类型安全

由于MapStruct是基于注解和代码生成的,它可以在编译时期就检查类型安全。如果源对象和目标对象的属性类型不匹配,编译将会失败,这有助于及早发现问题。

2.3 性能高效

MapStruct生成的代码是直接调用getter和setter方法,而不是使用反射,因此性能非常高效。这使得它非常适合在高并发、高性能要求的场景中使用。

2.4 自定义转换

MapStruct还支持自定义转换逻辑。如果您需要对某个属性的拷贝进行特殊处理,比如日期格式的转换,您可以通过实现自定义的转换方法,并在Mapper接口中指定使用这个方法进行转换。

3.如何使用

3.1 创建一个maven工程项目并引入mapstruct的坐标依赖:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.2.Final</version> <!-- 请使用最新版本 -->
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.2.Final</version> <!-- 请使用最新版本 -->
    <scope>provided</scope>
</dependency>

3.2 源对象类

/**
 * @ClassName JyFullOnlineTimeDO
 * @Description TODO
 * @Author xiaoxiao
 * @Date 2025/1/24
 */
public class JyFullOnlineTimeDO {
   
   

    private String reservedFieldOne;
    private String reservedFieldTwo;
    private String reservedFieldThree;

    // create getter and setter methods
    public String getReservedFieldOne() {
   
   
        return reservedFieldOne;
    }

    public void setReservedFieldOne(String reservedFieldOne) {
   
   
        this.reservedFieldOne = reservedFieldOne;
    }

    public String getReservedFieldTwo() {
   
   
        return reservedFieldTwo;
    }

    public void setReservedFieldTwo(String reservedFieldTwo) {
   
   
        this.reservedFieldTwo = reservedFieldTwo;
    }

    public String getReservedFieldThree() {
   
   
        return reservedFieldThree;
    }

    public void setReservedFieldThree(String reservedFieldThree) {
   
   
        this.reservedFieldThree = reservedFieldThree;
    }

}

3.3 目标对象类(和源对象类中的字段属性名相同)

/**
 * @ClassName CompanyOnlineSyncVO
 * @Description TODO
 * @Author xiaoxiao
 * @Date 2025/1/24
 */
public class CompanyOnlineSyncVO {
   
   

    private String reservedFieldOne;
    private String reservedFieldTwo;
    private String reservedFieldThree;
    //生成以上字段的getter和setter方法
    public String getReservedFieldOne
### ### MapStruct 使用教程及对象映射方法 MapStruct 是一种基于注解的 Java Bean 映射工具,它通过在编译时生成类型安全的映射代码,避免了运行时使用反射所带来的性能开销。这种方式不仅提高了映射效率,还增强了代码的可维护性,特别适用于 DTO(数据传输对象)与 Entity(实体)之间的转换[^1]。 #### 引入依赖 在使用 MapStruct 之前,需要在项目中引入其依赖。Maven 项目可以通过以下方式添加依赖: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.2.Final</version> </dependency> ``` 此外,还需要确保项目中包含了 MapStruct 的编译插件,以便在编译阶段生成映射实现类。 #### 定义 Mapper 接口 MapStruct 的核心在于通过接口定义映射关系,开发者只需声明接口和方法,具体的实现类将由 MapStruct 自动生成。以下是一个典型的 Mapper 接口示例: ```java import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper public interface CarMapper { CarMapper INSTANCE = Mappers.getMapper(CarMapper.class); @Mapping(source = "numberOfSeats", target = "seatCount") CarDto carToCarDto(Car car); @Mapping(target = "id", ignore = true) @Mapping(source = "seatCount", target = "numberOfSeats") Car carDtoToCar(CarDto carDto); } ``` 在这个例子中,`@Mapper` 注解表明这是一个 MapStruct 的映射接口。`@Mapping` 注解用于定义源对象和目标对象之间的字段映射关系。例如,`numberOfSeats` 字段映射到目标对象的 `seatCount` 字段。此外,`ignore = true` 表示忽略某些字段的映射[^4]。 #### 使用 @BeforeMapping 和 @AfterMapping 注解 在某些情况下,映射前后可能需要执行一些自定义逻辑。MapStruct 提供了 `@BeforeMapping` 和 `@AfterMapping` 注解来满足这一需求。以下是一个示例: ```java @Mapper public abstract class CarMapper { @BeforeMapping protected void enrichCar(Car car) { car.setMake(car.getMake().toUpperCase()); } @Mapping(source = "numberOfSeats", target = "seatCount") public abstract CarDto carToCarDto(Car car); @AfterMapping protected void enrichDto(Car car, @MappingTarget CarDto carDto) { carDto.setSeatCount(car.getNumberOfSeats()); } } ``` 在 `@BeforeMapping` 中,可以对源对象进行预处理,例如将字段值转换为大写。而在 `@AfterMapping` 中,则可以对目标对象进行后处理,例如设置额外的字段值。 #### 性能优势 MapStruct 的最大优势在于其性能。由于映射代码是在编译时生成的,因此避免了运行时反射带来的性能损耗。相比之下,其他基于反射的映射工具(如 BeanUtils)在性能上通常不如 MapStruct[^2]。 #### 适用场景 MapStruct 适用于 Java Bean 之间的转换,尤其适合在 DTO 与 Entity 之间进行映射。这种场景下,对象结构通常较为复杂,手动编写映射代码不仅繁琐,而且容易出错。MapStruct 通过注解驱动的方式,简化了映射过程,提高了开发效率[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值