Java实体映射工具:MapStruct 的使用方法

mapstruct这个插件就是用来处理domin实体类与model类的属性映射,定义mapper接口,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 除此之外如果使用的IDE是idea的话,还可以下载MapStruct的插件:

3 常用的几个注解参数

        MapStruct 提供的重要注解 :

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

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

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

       

        @Mapper 属性:
                对于原参数进行非 null的 判断
                        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS   
                对于原参数为空的情况下 返回一个空的对象
                        nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT
                忽略不匹配的属性
                       unmappedTargetPolicy = ReportingPolicy.IGNORE

                uses 使用策略的方式进行类型转换 (uses = xxx.class)

@Mappings 映射属性有多个的情况下会使用该注解,里面配合@Mapping来使用

属性:

     source 原参数 
            target 目标参数
            ignore 忽略(true) 不对属性字段进行处理
            defaultValue 给原参数为空的属性在转换时添加默认值
            dateFormat 对于时间类型的数据进行格式化
            constant 添加的常量数据(给某个属性赋值)

4 例子

import com.pojo.Sku;
import com.pojo.SkuDTO;
import com.pojo.User;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * 对于原参数进行非 null的 判断
 *     nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS
 *
 * 对于原参数为空的情况下 返回一个空的对象
 *     nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT
 *
 * 忽略不匹配的属性
 *     unmappedTargetPolicy = ReportingPolicy.IGNORE
 */
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,uses = MyStringLongMapper.class)
public interface SkuConverter {

    SkuConverter MAPPER = Mappers.getMapper(SkuConverter.class);

    /**
     * source 原参数 target 目标参数
     * ignore 忽略(true) 不对属性字段进行复制
     * defaultValue 默认值
     * dateFormat 对于时间类型的数据进行格式化
     *
     * @param dto
     * @return
     */
    @Mappings({
            // 对于属性字段不同的数据进行映射
            @Mapping(source = "id", target = "skuId"),
            @Mapping(source = "code", target = "skuCode"),
            @Mapping(source = "price", target = "skuPrice"),
            // 该属性会被忽略不进行处理
            @Mapping(target = "color",ignore = true),
            // 时间类型进行格式化处理
            @Mapping(source = "fomatDate", target = "fomatDate", dateFormat = "yyyy-MM-dd HH:mm:ss")
    })
    SkuDTO damin2dto(Sku dto);


    /**
     * 对于有两个原参数的数据可以使用 名称.属性
     * 如:user.name
     * @param dto
     * @param user
     * @return
     */
    @Mappings({
            @Mapping(source = "user.name", target = "itemName"),
            @Mapping(source = "dto.id", target = "skuId"),
            @Mapping(source = "dto.code", target = "skuCode"),
            @Mapping(source = "dto.price", target = "skuPrice"),
            @Mapping(target = "color",ignore = true),
            @Mapping(source = "dto.fomatDate", target = "fomatDate", dateFormat = "yyyy-MM-dd HH:mm:ss")
    })
    SkuDTO damin2dto(Sku dto, User user);


    /**
     * 对于集合数据的转换
     * 1.首先需要对象数据进行转换
     * 2.集合数据生成的方法会自动调用单个方法的数据
     * @param user
     * @return
     */
    @Mappings({
            @Mapping(source = "name", target = "itemName"),
            @Mapping(source = "age", target = "skuCode"),
            // 赋值为常量属性
            @Mapping(target = "color", constant = "测试数据")
    })
    SkuDTO damin2dto(User user);
    List<SkuDTO> damin2dto(List<User> user);

对象

import java.io.Serializable;
import java.util.Date;

public class Sku implements Serializable {

    private Long id;
    private String code;
    private Integer price;
    private String color;
    private Date fomatDate;


    @Override
    public String toString() {
        return "Sku{" +
                "id=" + id +
                ", code='" + code + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                ", fomatDate=" + fomatDate +
                '}';
    }
}

import java.io.Serializable;

public class SkuDTO implements Serializable {

    private String skuId;
    private String skuCode;
    private Integer skuPrice;
    private Long itemId;
    private String itemName;
    private String color;
    private String fomatDate;


    @Override
    public String toString() {
        return "SkuDTO{" +
                "skuId=" + skuId +
                ", skuCode='" + skuCode + '\'' +
                ", skuPrice=" + skuPrice +
                ", itemId=" + itemId +
                ", itemName='" + itemName + '\'' +
                ", color='" + color + '\'' +
                ", fomatDate='" + fomatDate + '\'' +
                '}';
    }
}

public class User {
	
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}

	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
}
/**
 * 方法中target和source 类型满足 MyStringLongMapper 中的方法时,
 * 会自动进行调用MyStringLongMapper里面的方法进行类型转换处理。
 * target = 入参
 * source = 出参
 */
public class MyStringLongMapper {

    public Integer stringToInteger(String data) {
        return !StringUtils.isEmpty(data) ? Integer.parseInt(data) : null;
    }

    public Long stringToLong(String data) {
        return !StringUtils.isEmpty(data) ? Long.parseLong(data) : null;
    }

    public String stringToString(String data) {
        return !StringUtils.isEmpty(data) ? data : null;
    }
}

    public static void main(String[] args) {
        Sku dto = new Sku();
        dto.setColor("blue");
        dto.setFomatDate(new Date());
        // 调用
        SkuDTO skuDTO = SkuConverter.MAPPER.damin2dto(dto,new User("",12));
        User user = new User("", 12);
        User user1 = new User("", 13);
        User user2 = new User("", 14);
        List<User> userList = new ArrayList<>();
        userList.add(user);
        userList.add(user1);
        userList.add(user2);

        List<SkuDTO> skuDTOS = SkuConverter.MAPPER.damin2dto(userList);
        System.out.println(skuDTOS);

        Sku sku = new Sku();
        sku.setPrice(12);
        sku.setColor("blue");
        sku.setCode("0134");
        SkuDTO skuDTO2 = SkuConverter.MAPPER.damin2dto(sku);
        System.out.println(skuDTO2);
    }

 SkuConverterImpl 为使用策略方式转换的数据

补充:如果需要转换的数据类型不同,比如一个是Long 一个是String 当转换的时候会自动转换类型进行匹配;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值