# MapStruct 映射工具
本篇主要讲解MapStruct 一款映射工具,只需简单的定义一个Mapper接口,在编译期间,MapStruct将生成此接口的实现,据说MapStruct性能最高是Spring的CopyProperties的10倍,与手工编写映射代码相比,MapStruct通过生成繁琐且易于编写的代码来节省时间。遵循约定优于配置方法,MapStruct使用合理的默认值,但在配置或实现特殊行为时会采取措施。
### 1.引入MapStruct的依赖
org.mapstruct
mapstruct-jdk8
1.3.0.Final
org.mapstruct
mapstruct-processor
1.3.0.Final
### 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 queryByTypeId(Integer typeId) {
List list = new ArrayList();
blogInfoRepository.findByBlogTypeId(typeId).stream().forEach(blogInfo -> {
list.add(BlogInfoConverter.INSTANCE.domain2vo(blogInfo));
});
return list;
}
### 总结
**本篇主要讲解MapStruct的基本使用方法,里面的很多其他的用法我也还没深入探究,不过我本是很喜欢使用MapStruct的**
> 个人博客地址: https://www.askajohnny.com 欢迎访问!
> 本文由博客一文多发平台 [OpenWrite](https://openwrite.cn?from=article_bottom) 发布!
原文地址:https://www.cnblogs.com/askajohnny/p/12072134.html