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转换的方法,有多个情况下集合转换就会报错