mapstruct基本使用

依赖

<dependency>
  <groupId>org.mapstruct</groupId>
  <artifactId>mapstruct</artifactId>
  <version>${mapstruct.version}</version>
</dependency>

<!-- 版本一定要在3.6.0以上,若版本低,则会报找不到属性的错误 -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.1</version>
  <configuration>
    <source>${java.version}</source>
    <target>${java.version}</target>
    <!--一定要在 maven-compiler-plugin 插件中,声明 mapstruct-processor 为 JSR 269 的 Java 注解处理器-->
    <annotationProcessorPaths>
      <path>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct.version}</version>
      </path>
      <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </path>
    </annotationProcessorPaths>
  </configuration>
</plugin>

使用

package com.example.util;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTransform {
  public static LocalDateTime strToDate(String str) {
    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
    return LocalDateTime.parse(str, df);
  }
}
@Mapper(componentModel = "spring")
public interface UserConvert {
  UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

  /**
  * 字段相同属性名称相同时,采用 BeanUtil 也可以实现相同功能
  */
  User01 convert(User user);

  List<User01> convert(List<User> users);

  /**
  * 字段数量类型相同,数量少:仅能让多的转换成少的
  */
  User02 convertV02(User user);

  User convertV(User02 user02);

  @Mapping(target = "updateTime", expression = "java(com.example.util.DateTransform.strToDate(user03.getUpdateTime()))")
  User convertFromUser03(User03 user03);
}
public class User {
  private Integer id;
  private String name, createTime;
  private LocalDateTime updateTime;
}

public class User01 {
  private Integer id;
  private String name, createTime;
  private LocalDateTime updateTime;
}

public class User02 {
  private Integer id;
  private String name, createTime;
}

public class User03 {
  private String id, name;
  // 实体类该属性是String
  private LocalDateTime createTime;
  // 实体类该属性是LocalDateTime
  private String updateTime;
}

多转一

在多对一转换时, 遵循以下几个原则

  1. 当多个对象中, 有其中一个为 null, 则会直接返回 null
  2. 如一对一转换一样, 属性通过名字来自动匹配。 因此, 名称和类型相同的不需要进行特殊处理
  3. 当多个原对象中,有相同名字的属性时,需要通过 @Mapping 注解来具体的指定, 以免出现歧义(不指定会报错)。 如上面的 description
public class Address {
  private String street, zipCode, houseNo, description;
}

public class Person {
  private int height;
  private String firstName, lastName, description;
}

public class DeliveryAddress {
  private int height;
  private String street, zipCode, houseNumber, description;
  private String firstName, lastName;
}
@Mapping(source = "person.description", target = "description")
@Mapping(source = "address.houseNo", target = "houseNumber")
DeliveryAddress personAndAddress(Person person, Address address);

更新Bean对象

有时候, 并不是想返回一个新的 Bean 对象, 而是希望更新传入对象的一些属性。这个在实际的时候也会经常使用到

void update(User user, @MappingTarget User01 user01);

public void update(User user, User01 user01) {
  if (user != null) {
    user01.setId(user.getId());
    user01.setName(user.getName());
    user01.setCreateTime(user.getCreateTime());
    user01.setUpdateTime(user.getUpdateTime());
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

①笶侕濄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值