企业开发Java对象映射DTO转换PO或者VO工具对象转对象
Java对象映射
您好!如果您也遇到项目开发中对象转对象的复杂业务逻辑,那么这篇文章一定对您有帮助。
在真实开发中,经常需要将数据库查询出来的数据转换成另一个对象输出的API,这也是我们开发时最头疼的,如果自己一个一个的去写getter、setter,那显然是要疯的,这时候了解更多的对象映射方案就尤为重要。
常用对象映射工具
1.ModelMapper
ModelMapper 是一个智能对象映射库,可以自动将对象相互映射。它使用基于约定的方法,同时提供简单的重构安全 API 来处理特定用例。
ModelMapper 的目标是使对象映射变得容易,通过自动确定一个对象模型如何映射到另一个对象模型,基于约定,以与人类相同的方式 - 同时提供一个简单的、重构安全的 API 来处理特定用例。
将modelmapper库添加为依赖项:
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.2</version>
</dependency>
被转换对象
class Order {
Customer customer;
Address billingAddress;
}
class Customer {
Name name;
}
class Name {
String firstName;
String lastName;
}
class Address {
String street;
String city;
}
转换
ModelMapper modelMapper = new ModelMapper();
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);
转换后的对象
class OrderDTO {
String customerFirstName;
String customerLastName;
String billingStreet;
String billingCity;
}
2.MapStruct
MapStruct 是一个代码生成器,它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现。
生成的映射代码使用简单的方法调用,因此速度快、类型安全且易于理解。
多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct 旨在通过尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct 在编译时生成 bean 映射,以确保高性能,允许快速的开发人员反馈和彻底的错误检查。
添加依赖
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
被转换的 实体类
public class Car {
private String make;
private int numberOfSeats;
private CarType type;
//constructor, getters, setters etc.
}
转换
@Mapper 1
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); 3
@Mapping(source = "numberOfSeats", target = "seatCount")
CarDto carToCarDto(Car car); 2
}
转换后的DTO
public class CarDto {
private String make;
private int seatCount;
private String type;
//constructor, getters, setters etc.
}
测试
@Test
public void shouldMapCarToDto() {
//given
Car car = new Car( "Morris", 5, CarType.SEDAN );
//when
CarDto carDto = CarMapper.INSTANCE.carToCarDto( car );
//then
assertThat( carDto ).isNotNull();
assertThat( carDto.getMake() ).isEqualTo( "Morris" );
assertThat( carDto.getSeatCount() ).isEqualTo( 5 );
assertThat( carDto.getType() ).isEqualTo( "SEDAN" );
}
3.Dozer
该项目目前不活跃,将来很可能会被弃用。如果您希望在新建项目中使用 Dozer,我们将不鼓励这样做。如果您已经使用 Dozer 一段时间了,我们建议您开始考虑迁移到另一个库,例如:
Dozer 是 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象。通常,这些 Java Bean 将具有不同的复杂类型。
Dozer 支持简单属性映射、复杂类型映射、双向映射、隐式-显式映射以及递归映射。这包括也需要在元素级别进行映射的映射集合属性。
4.其他了解
-
Commons-Convert
Convert是一个专门用于将一种类型的对象转换为另一种类型的任务的库。该库非常适用于脚本语言或任何需要将一种 Java 对象类型转换(或强制)为另一种类型的应用程序。- 目标:
- 提供一个简单的 API 来将一个任意 Java 对象转换为另一个
- 提供全面的转换器库
- 支持区域敏感的国际化转换
- 适应应用程序定义类型的转换
- 目标:
-
Commons-BeanUtils:
大多数 Java 开发人员习惯于为属性 getter 和 setter 创建符合 JavaBeans 命名模式的 Java 类。然后很自然地直接访问这些方法,使用对相应的 getXxx和setXxx方法的调用。但是,在某些情况下,需要动态访问 Java 对象属性(无需在编译时了解要调用的属性 getter 和 setter 方法)。示例用例包括:- 构建与 Java 对象模型交互的脚本语言(例如 Bean 脚本框架)。
- 为 Web 演示和类似用途(例如 JSP 或 Velocity)构建模板语言处理器。
- 为 JSP 和 XSP 环境(例如 Jakarta Taglibs、Struts、Cocoon)构建自定义标记库。
- 使用基于 XML 的配置资源(例如 Ant 构建脚本、Web 应用程序部署描述符、Tomcat 的server.xml 文件)。
-
Commons-Lang3:
标准 Java 库无法提供足够的方法来操作其核心类。Apache Commons Lang 提供了这些额外的方法。
Apache Commons Lang 为 java.lang API 提供了大量辅助实用程序,特别是字符串操作方法、基本数值方法、对象反射、并发、创建和序列化以及系统属性。此外,它还包含对 java.util.Date 的基本增强和一系列致力于帮助构建方法的实用程序,例如 hashCode、toString 和 equals。 -
Commons-Convert:Commons-Convert旨在提供一个专门用于将一种类型的对象转换为另一种类型的任务的库。 第一阶段将重点关注Object to String和String to Object转换。
-
Spring框架:Spring对PropertyEditors有很好的支持,也可用于将对象转换为/从Strings转换。
推荐一个不错的视频教程:Java视频教程