ModelMapper
简介
应用程序通常由相似但不同的对象模型组成,其中两个模型中的数据可能相似,但是模型的结构和关注点不同。使用 ModelMapper 可以轻松地将一个模型(DTO)转换为另一个模型(DMO),从而使分离的模型保持隔离状态。
ModelMapper 的目标是通过基于惯例的方式自动确定一个对象模型如何映射到另一个对象模型,从而简化对象映射,同时提供一种简单的,重构安全的 API 来处理特定的用例。
- ModelMapper 分析您的对象模型,以智能地确定应如何映射数据。无需手动映射。ModelMapper 会为您完成大部分工作,并自动投影和展平复杂模型。
- ModelMapper 使用约定来确定属性和值如何相互映射。用户可以创建自定义约定,也可以使用提供的约定之一。
- ModelMapper 提供了一个简单,流畅的映射API,用于处理特殊用例。该 API 是类型安全和重构安全的,使用实际代码而不是字符串引用来映射属性和值。
- ModelMapper 支持与任何类型的数据模型集成。从 JavaBeans 和 JSON 树到数据库记录,ModelMapper 可以为您完成繁重的工作。
快速上手
引入 Maven 依赖
<!-- http://modelmapper.org/getting-started/-->
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.0</version>
</dependency>
源模型
Order
@Data
@AllArgsConstructor
public class Order {
Customer customer;
Address billingAddress;
Long orderNumber;
String pay;
String shopName;
}
Customer
@Data
@AllArgsConstructor
public class Customer {
Name name;
}
Name
@Data
@AllArgsConstructor
public class Name {
String firstName;
String lastName;
}
Address
@Data
@AllArgsConstructor
public class Address {
String street;
String city;
}
目标模型
OrderDTO
@Data
public class OrderDTO {
String customerFirstName;
String customerLastName;
String billingStreet;
String billingCity;
Long order_number;
String modeOfpay;
String shop_name;
}
默认约定
@Test
public void pojoslateTesting() {
//源模型
Order order = new Order(new Customer(new Name("张", "晋")), new Address("朝阳", "北京"), 4251221L,"支付宝","Nike");
//模型映射
ModelMapper modelMapper = new ModelMapper();
//使用LOOSE松散策略
//modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);
//添加自定义映射规则
//modelMapper.addMappings(customField()) ;
//OrderDTO orderDTO = modelMapper.map(order, new TypeToken<OrderDTO>() {}.getType());
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);
//OrderDTO(customerFirstName=张, customerLastName=晋, billingStreet=朝阳, billingCity=北京, order_number=null, modeOfpay=null, shop_name=null)
System.out.println(orderDTO);
}
可用约定(预置匹配策略)
ModelMapper 包括一些用于处理不同属性匹配要求的预定义约定: 预置匹配策略
@Test
public void pojoslateTesting() {
//源模型
Order order = new Order(new Customer(new Name("张", "晋")), new Address("朝阳", "北京"), 4251221L,"支付宝","Nike");
//模型映射
ModelMapper modelMapper = new ModelMapper();
//使用LOOSE松散策略: orderNumber => order_number、ordernumber 反之亦然
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);
//OrderDTO(customerFirstName=张, customerLastName=晋, billingStreet=朝阳, billingCity=北京, order_number=4251221, modeOfpay=null, shop_name=Nike)
System.out.println(orderDTO);
}
自定义映射规则
@Test
public void pojoslateTesting() {
//源模型
Order order = new Order(new Customer(new Name("张", "晋")), new Address("朝阳", "北京"), 4251221L,"支付宝","Nike");
//模型映射
ModelMapper modelMapper = new ModelMapper();
//添加自定义映射规则
modelMapper.addMappings(customField()) ;
OrderDTO orderDTO = modelMapper.map(order, new TypeToken<OrderDTO>() {}.getType());
//OrderDTO(customerFirstName=张, customerLastName=晋, billingStreet=朝阳, billingCity=北京, order_number=4251221, modeOfpay=支付宝, shop_name=Nike)
System.out.println(orderDTO);
}
/**
* 自定义映射规则
*/
private static PropertyMap customField(){
/**
* 自定义映射规则
*/
return new PropertyMap<Order,OrderDTO>() {
@Override
protected void configure() {
/**使用自定义转换规则*/
map(source.getOrderNumber(),destination.getOrder_number());
map(source.getShopName(), destination.getShop_name());
map(source.getPay(),destination.getModeOfpay());
}
};
}