MapStrust使用

MapStrust简介

更优雅的给对象映射赋值


MapStrust使用

依赖

<!--mapStruct依赖 高性能对象映射-->
<!--mapstruct核心-->
<dependency>
	<groupId>org.mapstruct</groupId>
	<artifactId>mapstruct</artifactId>
	<version>1.3.1.Final</version>
</dependency>
<!--mapstruct编译-->
<dependency>
	<groupId>org.mapstruct</groupId>
	<artifactId>mapstruct-processor</artifactId>
	<version>1.3.1.Final</version>
</dependency>

测试:主要做DTO转换成PO

package com.example.bootdemo.dto;

import java.util.Date;

public class ComputerDTO {

    private String id;

    private String name;

    private String cpu;

    private String dto;

    private Date date;

    private double price;

	// 省略set/get

    public ComputerDTO(String id, String name, String cpu, String dto) {
        this.id = id;
        this.name = name;
        this.cpu = cpu;
        this.dto = dto;
    }

    public ComputerDTO(String id, String name, String cpu, String dto, Date date, double price) {
        this.id = id;
        this.name = name;
        this.cpu = cpu;
        this.dto = dto;
        this.date = date;
        this.price = price;
    }

}

package com.example.bootdemo.po;

import java.util.Date;

public class ComputerPO {

    private String id;

    private String name;

    private String cpu;

    private String po;

    private String date;

    private String price;

	// 省略set/get

    @Override
    public String toString() {
        return "ComputerPO{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", cpu='" + cpu + '\'' +
                ", po='" + po + '\'' +
                ", date='" + date + '\'' +
                ", price=" + price +
                '}';
    }
}

编写转换工具类

package com.example.bootdemo.util;

import com.example.bootdemo.dto.ComputerDTO;
import com.example.bootdemo.po.ComputerPO;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;

import java.util.List;

@Mapper
public abstract class ComputerConvert {

    public static ComputerConvert computerConvert = Mappers.getMapper(ComputerConvert.class);

    @Mapping(source = "dto", target = "po")
    public abstract ComputerPO computerDTO2PO(ComputerDTO computerDTO);

    @Mapping(target = "id", ignore = true)
    public abstract ComputerPO computerDto2PoIgnoreId(ComputerDTO computerDTO);

    @Mapping(source = "date", target = "date", dateFormat = "yyyy-MM-dd")
    @Mapping(source = "price", target = "price", numberFormat = "#.00")
    public abstract ComputerPO computerDto2PoFormat(ComputerDTO computerDTO);

    @AfterMapping
    public void computerDto2PoUd(ComputerDTO computerDTO, @MappingTarget ComputerPO computerPO) {
        String name = computerDTO.getName() + "111";
        computerPO.setName(name);
    }

    @Mapping(source = "dto", target = "po", ignore = true)
    public abstract List<ComputerPO> computerDTO2POs(List<ComputerDTO> computerDTOs);


        /**
     * 忽略默认的自动转换,只转换@Mapping指定的字段
     * @param computerDTOs
     * @return
     */
    @BeanMapping(ignoreByDefault = true)
    @Mapping(source = "dto", target = "po")
    public abstract ComputerPO computerDTO2POUdDefault(ComputerDTO computerDTOs);

}

测试和讲解

package com.example.bootdemo.test;

import com.example.bootdemo.dto.ComputerDTO;
import com.example.bootdemo.po.ComputerPO;
import com.example.bootdemo.util.ComputerConvert;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Test {

    /**
     * 复杂代码实体类转换
     * DTO -> PO
     * @return
     */
    public void oldSet() {
        ComputerDTO computerDTO = new ComputerDTO("1", "联想", "英特尔", "Y");
        ComputerPO computerPO = new ComputerPO();
        computerPO.setId(computerDTO.getId());
        computerPO.setName(computerDTO.getName());
        computerDTO.setCpu(computerDTO.getName());
        System.out.println(computerPO.toString());
    }

    /**
     * DTO -> PO 属性映射
     * dto字段映射赋值给po字段,名称不同不能自动映射,要用@Mapping(source = "dto", target = "po")去指定
     */
    public static void utilTest1() {
        ComputerDTO computerDTO = new ComputerDTO("1", "联想", "英特尔", "S");
        ComputerPO computerPO =  ComputerConvert.computerConvert.computerDTO2PO(computerDTO);
        System.out.println(computerPO.toString());
    }

    /**
     * DTO -> PO 属性映射
     * 日期和数字类型要按照指定格式去转换映射
     * @Mapping(source = "date", target = "date", dateFormat = "yyyy-MM-dd")
     * @Mapping(source = "price", target = "price", numberFormat = "#.00")
     */
    public static void utilTest2() {
        ComputerDTO computerDTO = new ComputerDTO("1", "联想", "英特尔", "S", new Date(), 1.8009);
        ComputerPO computerPO =  ComputerConvert.computerConvert.computerDto2PoFormat(computerDTO);
        System.out.println(computerPO.toString());
    }

    /**
     * 属性自定义赋值
     * @AfterMapping配合@MappingTarget
     * (ComputerDTO computerDTO, @MappingTarget ComputerPO computerPO)
     * 表示调用自动转换computerDTO2PO方法后,执行该@AfterMapping注解标注的方法
     * @MappingTarget ComputerPO computerPO是已经转换完成的对象
     */
    public static void utilTest3() {
        ComputerDTO computerDTO = new ComputerDTO("1", "联想", "英特尔", "S", new Date(), 1.8009);
        ComputerPO computerPO =  ComputerConvert.computerConvert.computerDTO2PO(computerDTO);
        System.out.println(computerPO.toString());
    }


    public static void utilTest4() {
        ComputerDTO computerDTO1 = new ComputerDTO("1", "联想", "英特尔", "S", new Date(), 1.8009);
        ComputerDTO computerDTO2 = new ComputerDTO("1", "联想", "英特尔", "S", new Date(), 1.8009);
        List<ComputerDTO> computerDTOList = new ArrayList<>();
        computerDTOList.add(computerDTO1);
        computerDTOList.add(computerDTO2);
        List<ComputerPO> computerPOList =  ComputerConvert.computerConvert.computerDTO2POs(computerDTOList);
        System.out.println(computerDTOList.toString());
    }


    public static void main(String[] args) {
        Test.utilTest4();
    }

}

注意,调用集合转换时,不能有多个ComputerDTO -> ComputerPO转换的方法,方法名不同还是会报错。内部调用其实是循环调一个ComputerDTO -> ComputerPO转换的方法,有多个情况下集合转换就会报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值