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 当转换的时候会自动转换类型进行匹配;