3

MapStruct 映射工具

 本篇主要讲解MapStruct 一款映射工具,只需简单的定义一个Mapper接口,在编译期间,MapStruct将生成此接口的实现,据说MapStruct性能最高是Spring的CopyProperties的10倍,与手工编写映射代码相比,MapStruct通过生成繁琐且易于编写的代码来节省时间。遵循约定优于配置方法,MapStruct使用合理的默认值,但在配置或实现特殊行为时会采取措施。

 1.引入MapStruct的依赖

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


 2.使用MapStruct

  2.1 创建实体Entity
@Data
@Entity
@EntityListeners(AuditingEntityListener.class)
public class BlogInfo {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

/**
 * 博客标题
 */
  @Field(analyzer = "ik_max_word"  , type = FieldType.Text , searchAnalyzer = "ik_max_word")
  private String blogTitle;
/**
 * 博客内容
 */
  @Column(columnDefinition = "text")
  private String blogContent;

/**
 * 博客简要
 */
  private String blogShortContent;

}    
  2.2 创建Vo对象或者DTO对象
@Data
@Accessors(chain = true)
public class BlogInfoVo {

  private Long id;

/**
 * 博客标题
 */
  private String blogTitle;
/**
 * 博客内容
 */
  private String blogContent;

/**
 * 博客简要
 */
  private String blogShortContent;

}
  2.3 创建一个Mapper接口

  1.类名上面添加@Mapper注解,使用Mybatis的小伙伴要注意导入的是MapStruct的@Mapper 不要混淆
  2.写上转化方法,如果有属性 字段 或者 类型 不同可以使用 @Mappings指定
  3.当需要从字符串Date转成日期Date时候需要提供一个 uses = DateMapper.class

/**
 * Media Converter
 *
 * @author johnny
 * @create 2019-11-08 上午11:20
 **/

@Mapper(uses = DateMapper.class )
public interface BlogInfoConverter {

  BlogInfoConverter INSTANCE = Mappers.getMapper(BlogInfoConverter.class);

    @Mappings({
            @Mapping(source = "createDate", target = "createDate" ,dateFormat = "yyyy-MM-dd"),
        //表示从BlogInfo的createDate 转成 BlogInfoVo的createDate 使用 yyyy-MM-dd进行转换
            @Mapping(source = "createTime" , target = "createTime" , dateFormat = "yyyy-MM-dd"),
            @Mapping(target = "anchors" , ignore = true)
})
    BlogInfoVo domain2vo(BlogInfo blogInfo);

//这里包含 从String类型的Date转换成日期类型的Date,就需要使用 uses=DateMapper.class
    BlogInfo vo2domain(BlogInfoVo blogInfoVo);

}

  贴出来:可以直接粘贴使用
  DateMapper

public class DateMapper {

  public String asString(Date date) {
    return date != null ? new SimpleDateFormat("yyyy-MM-dd")
            .format(date) : null;
  }

  public Date asDate(String date) {
    try {
        return date != null ? new SimpleDateFormat("yyyy-MM-dd")
                .parse(date) : null;
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
  }
}

  2.4 调用

  BlogInfoConverter.INSTANCE.domain2vo

  
@Override
public List<BlogInfoVo> queryByTypeId(Integer typeId) {
    List<BlogInfoVo> list = new ArrayList<>();
    blogInfoRepository.findByBlogTypeId(typeId).stream().forEach(blogInfo -> {
        list.add(BlogInfoConverter.INSTANCE.domain2vo(blogInfo));
    });
    return list;
}


 总结

  本篇主要讲解MapStruct的基本使用方法,里面的很多其他的用法我也还没深入探究,不过我本是很喜欢使用MapStruct的

个人博客网站 https://www.askajohnny.com 欢迎来访问!
本文由博客一文多发平台 OpenWrite 发布!

Aska小强
100 声望6 粉丝