java mapstruct详解_Java开发中Mapstruct实践

背景

我们经常需要domin实体类与model类的属性映射,有时候映射还需要一些转换。每次手写很麻烦。于是就有了mapstruct。这个插件自动实现映射接口,避免了重复而复杂的映射实现。

mapstruct官方相关内容

优点

1 使用普通方法调用而不是反射来快速执行,在编译器生成相应的 Impl 方法调用时直接通过简单的 getter/setter调用而不是反射或类似的方式将值从源复制到目标

2 编译时类型安全性,只能映射彼此的对象和属性,不将商品实体意外映射到用户 DTO等

3在构建时清除错误报告,比如映射不完整 (并非所有目标属性都被映射) 或 映射不正确(无法找到适当的映射方法或类型转换)

重要注解

1 @Mapper : 标记这个接口作为一个映射接口,并且是编译时 MapStruct 处理器的入口

2 @Mapping : 解决源对象和目标对象中,属性名字不同的情况

3 Mappers.getMapper 自动生成的接口的实现可以通过 Mapper 的 class对象获取,从而让客户端可以访问 Mapper接口的实现

实践

场景

一般大家再开发用户系统的时候,都会由用户头像,有可能用户头像可能再另外一个专门的图片管理的model中。在前端或者页面需要使用的时候,实际上只需要头像的地址或者名称,所以这时候user 和 userDto 中的头像映射是需要自己实现的

图像domain

import lombok.Data;

import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;

import java.io.Serializable;

import java.sql.Timestamp;

/**

* @author Horace pei

* @date 2020-5-12

*/

@Data

@Entity

@Table(name = "xs_image")

public class Image implements Serializable {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

private String filename;

private String size;

@Column(name = "delete_url")

private String delete;

@CreationTimestamp

@Column(name = "create_time")

private Timestamp createTime;

/** 用于检测文件是否重复 */

private String md5Code;

@Override

public String toString() {

return "Picture{" +

"filename='" + filename + '\'' +

'}';

}

}

用户信息domain

import lombok.Getter;

import lombok.Setter;

import me.zhengjie.modules.common.domain.Image;

import javax.persistence.*;

import javax.validation.constraints.NotBlank;

import javax.validation.constraints.NotNull;

import java.io.Serializable;

import java.util.List;

/**

* @author horace pei

* @date 2020-5-13

*/

//jpa用户信息实体类

@Entity

@Getter

@Setter

@Table(name = "xs_consultants_info")

public class Info implements Serializable {

//序号

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Column(name = "id")

@NotNull(groups = Update.class)

private Long id;

//姓名

@Column(name = "name", nullable = false)

@NotBlank

private String name;

//性别

@Column(name = "gender", nullable = false)

@NotBlank

private String gender;

//头像

@OneToOne

@JoinColumn(name = "avatar_id")

private Image avatarImage;

public @interface Update {

}

用户信息Dto

import lombok.Data;

import me.zhengjie.modules.common.domain.Image;

import java.io.Serializable;

import java.util.List;

import java.util.Set;

/**

* @author horace pei

* @date 2020-4-18

*/

//jpa咨询师信息回吐数据,需要多个bean组合而成

@Data

public class InfoDto implements Serializable {

//序号

private Long id;

//姓名

private String name;

//性别

private String gender;

//电话

private String mobile;

//头像

private String avatar;

}

那么问题来了大家注意到了domain中的头像是Image对象,而Dto中的头像是字符串。在使用Mapstruct如果做映射呢?

mapper写法

import me.zhengjie.base.BaseMapper;

import me.zhengjie.modules.consultant.domain.Info;

import me.zhengjie.modules.consultant.service.dto.InfoDto;

import org.mapstruct.Mapper;

import org.mapstruct.Mapping;

import org.mapstruct.Mappings;

import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)

public interface InfoMapper extends BaseMapper {

/**

* 转换

* @param info 原始数据

* @return /

*/

@Override

@Mappings({

@Mapping(source = "info.avatarImage.filename", target = "avatar")

})

InfoDto toDto(Info info);

}

说明:

1 注意source的赋值用的是函数参数的变量名称

2 如果有多个需要单独映射的,只需要更多的@Mapping注解即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值