MapStruct实体转换及List转换的方法讲解

 更新时间:2019年03月13日 14:03:10   作者:双斜杠少年  
今天小编就为大家分享一篇关于MapStruct实体转换及List转换的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地址: http://mapstruct.org/

引入依赖

    <dependency>
      <groupId>org.mapstruct</groupId>
      <artifactId>mapstruct-jdk8</artifactId>
      <version>1.1.0.Final</version>
    </dependency>

需求

我们假设有学生student 类 需要转换成 用户 user 类,将学生信息存入用户信息库

此时Student 类内容如下:

public class Student {
  private Integer id;
  private String name;
  private Integer age;
  private String sex;
  //setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦 
  }

此时User 类内容如下:

public class User {
  private Integer id;
  private String name;
  private Integer age;
  private String sex;
  //setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦 
 }

转换model

此时 Student 和 User 的属性名字都相同那么转换接口就是

import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student 转化为 User
   * @param Student
   * @return
   */
   User studentToUser(Student student);
}

程序运行前要先编译 mvn clean compile , 从而mapstruct框架生成UserMappingImpl 实现类。

转换model 属性不匹配

如果 User 和 Student 的属性名不对应例如:

此时Student 类内容如下:

public class Student {
  private Integer id;
  private String sname;
  private Integer age;
  private String sex;
  //setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦 
  }

此时User 类内容如下:

public class User {
  private Integer id;
  private String uname;
  private Integer age;
  private String sex;
  //setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦 
 }

那么转换接口为

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student 转化为 User
   * @param Student
   * @return
   */
   @Mappings({
      @Mapping(target = "uname", source = "sname")
     // 多个属性不对应可以用 "," 隔开编写多个@Mapping
     // ,@Mapping(target = "uname", source = "sname")
  })
   User studentToUser(Student student);
}

转换model 属性类型不匹配

比如说user 类的sex字段类型改为boolean

此时User 类内容如下:

public class User {
  private Integer id;
  private String uname;
  private Integer age;
  private boolean sex;
  //setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦 
 }

这个转换需求有点变态,所以 需要我门自己写个转换类

public class UserTransform {
  public String booleanToString(boolean value){
    if(value){
      return "男";
    }
    return "女";
  }
  public boolean strToBoolean(String str){
    if ("男".equals(str)) {
      return true;
    }
    return false;
  }
}

那么转换接口为(使用 UserTransform.class 类)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring",uses = UserTransform.class)
public interface UserMapping {
  /**
   * Student 转化为 User
   * @param Student
   * @return
   */
   @Mappings({
      @Mapping(target = "uname", source = "sname")
     // 多个属性不对应可以用 "," 隔开编写多个@Mapping
     // ,@Mapping(target = "uname", source = "sname")
  })
   User studentToUser(Student student);
}

转换list

当user 和 student 都是集合形式list 时应当如下转换

转化 List<> 集合时必须有 实体转化,因为在实现中,List 转换是 for循环调用 实体转化的。所以当属性名不对应时,应该在 实体转化进行 @Mappings 的属性名映射配置,然后list的转换也会继承这和属性的映射。

例如 属性名相同

import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student 转化为 User
   * @param Student
   * @return
   */
   User studentToUser(Student student);
   /**
   * Students 转化为 Users
   * @param Students
   * @return
   */
   List<User> studentsToUsers(List<Student> students);

属性名不同:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student 转化为 User
   * @param Student
   * @return
   */
   @Mappings({
      @Mapping(target = "uname", source = "sname")
     // 多个属性不对应可以用 "," 隔开编写多个@Mapping
     // ,@Mapping(target = "uname", source = "sname")
  })
   User studentToUser(Student student);
  /**
   * 此时 studentsToUsers 的实现为循环调用 studentToUser 并继承了 studentToUser 的属性映射
   * Students 转化为 Users
   * @param Students
   * @return
   */
   List<User> studentsToUsers(List<Student> students);
}

展示自动生成的 UserMappingImpl 实现(此类为 执行 mvn clean compile 后自动生成)

@Component
public class UserMappingImpl implements UserMapping {
  @Override
  public User studentToUser(student student) {
    if ( student == null ) {
      return null;
    }
    User user = new User();
    User.setId(student.getId() );
    User.setName(student.getName() );
    // 如果配置了属性映射则为
    //User.setUname(student.getSname() );
    User.setSex(student.getSex() );
    User.setAge(student.getAge() );
    return user;
  }
  @Override
  public List<User> studentsToUsers(List<student> students) {
    if ( students == null ) {
      return null;
    }
    List<User> list = new ArrayList<User>();
    for ( student student : students ) {
      list.add( studentToUser( student ) );
    }
    return list;
  }
}

参考资料 :https://www.jb51.net/article/157763.htm

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Jackson优雅序列化Java枚举类过程解析

    Jackson优雅序列化Java枚举类过程解析

    这篇文章主要介绍了Jackson优雅序列化Java枚举类过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • logback和log4j日志框架堆栈信息添加TraceId方式

    logback和log4j日志框架堆栈信息添加TraceId方式

    这篇文章主要介绍了logback和log4j日志框架堆栈信息添加TraceId方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java实体映射工具MapStruct使用方法详解

    Java实体映射工具MapStruct使用方法详解

    MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,这篇文章主要给大家介绍了关于Java实体映射工具MapStruct使用的相关资料,需要的朋友可以参考下
    2021-11-11
  • spring boot ${}占位符不起作用的解决方案

    spring boot ${}占位符不起作用的解决方案

    这篇文章主要介绍了spring boot ${}占位符不起作用的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 浅谈为什么Java中1000==1000为false而100==100为true

    浅谈为什么Java中1000==1000为false而100==100为true

    这篇文章主要介绍了浅谈为什么Java中1000==1000为false而100==100为true,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 一个例子带你看懂Java中synchronized关键字到底怎么用

    一个例子带你看懂Java中synchronized关键字到底怎么用

    synchronized是Java里的一个关键字,起到的一个效果是"监视器锁",它的功能就是保证操作的原子性,同时禁止指令重排序和保证内存的可见性,下面这篇文章主要给大家介绍了关于如何通过一个例子带你看懂Java中synchronized关键字到底怎么用的相关资料,需要的朋友可以参考下
    2022-10-10
  • SpringBoot中@Pattern注解对时间格式校验方式

    SpringBoot中@Pattern注解对时间格式校验方式

    这篇文章主要介绍了SpringBoot中@Pattern注解对时间格式校验方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java计算几何图形面积的实例代码

    Java计算几何图形面积的实例代码

    这篇文章主要介绍了Java计算几何图形面积的实例代码,需要的朋友可以参考下
    2014-03-03
  • JS求多个数组的重复数据

    JS求多个数组的重复数据

    这篇文章主要介绍了JS求多个数组的重复数据的办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Springboot分页插件使用实例解析

    Springboot分页插件使用实例解析

    这篇文章主要介绍了Springboot分页插件使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论