实体类转换工具
工具列表
- Apache BeanUtils
- Spring BeanUtils
- cglib BeanCopier
- Hutool BeanUtil
- MapStruct
- Dozer
Apache BeanUtils
- 基于反射实现bean复制
- 浅拷贝。
依赖坐标
xml
<!--Apache BeanUtils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>使用案例
java
@Test
public void appacheBeanUtilsTest() throwsInvocationTargetException, IllegalAccessException {
OrderPO orderPO = new OrderPO();
orderPO.setId(1);
orderPO.setOrderNumber("orderNumber 123456");
ArrayList<String> proIds = new ArrayList<String>();
proIds.add("productID 1");
proIds.add("productID 2");
proIds.add("productID 3");
orderPO.setProId(proIds);
OrderDTO orderDTO = new OrderDTO();
BeanUtils.copyProperties(orderDTO, orderPO);
System.out.println(orderPO);
System.out.println(orderDTO);
}注意点
- Apache BeanUtils使用的是浅拷贝,可以看到List对象使用的是同一个对象。

Spring BeanUtils
在使用Spring时,推荐使用Spring BeanUtils。一是无需额外引入,二是Spring BeanUtils内部使用了缓存,加快转换速度。
- 基于反射复制bean
- 浅拷贝
依赖坐标
如果我们的项目使用了Spring,那么Spring BeanUtils是自带的,无需单独引入依赖。
xml
<!--Spring BeanUtils-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>6.0.9</version>
</dependency>使用案例
java
@Test
public void springBeanUtilsTest(){
OrderPO orderPO = new OrderPO();
orderPO.setId(1);
orderPO.setOrderNumber("orderNumber 123456");
ArrayList<String> proIds = new ArrayList<String>();
proIds.add("productID 1");
proIds.add("productID 2");
proIds.add("productID 3");
orderPO.setProId(proIds);
OrderDTO orderDTO = new OrderDTO();
org.springframework.beans.BeanUtils.copyProperties(orderPO,orderDTO,"orderNumber");
System.out.println(orderPO);
System.out.println(orderDTO);
}注意点
- Spring BeanUtils使用的是浅拷贝,可以看到List对象使用的是同一个对象。

cglib BeanCopier
- 基于字节码文件实现bean复制
- 浅拷贝
依赖坐标
如果工程包含了spring-core则无需引入依赖,否则需要单独引入。
xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>使用案例
java
@Test
public void cglibBeanCopierTest(){
OrderPO orderPO = new OrderPO();
orderPO.setId(1);
orderPO.setOrderNumber("orderNumber 123456");
ArrayList<String> proIds = new ArrayList<String>();
proIds.add("productID 1");
proIds.add("productID 2");
proIds.add("productID 3");
orderPO.setProId(proIds);
OrderDTO orderDTO = new OrderDTO();
BeanCopier beanCopier = BeanCopier.create(OrderPO.class, OrderDTO.class, false);
beanCopier.copy(orderPO,orderDTO,null);
System.out.println(orderPO);
System.out.println(orderDTO);
}注意点
- cglib BeanCopier使用的是浅拷贝。

Hutool BeanUtil
- 基于反射实现bean复制
- 深拷贝
依赖坐标
xml
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.0</version>
</dependency>使用案例
java
@Test
public void hutoolBeanCopyTest() {
OrderPO orderPO = new OrderPO();
orderPO.setId(1);
orderPO.setOrderNumber("orderNumber 123456");
ArrayList<String> proIds = new ArrayList<String>();
proIds.add("productID 1");
proIds.add("productID 2");
proIds.add("productID 3");
orderPO.setProId(proIds);
OrderDTO orderDTO = new OrderDTO();
BeanUtil.copyProperties(orderPO, orderDTO, "orderNumber");
System.out.println(orderPO);
System.out.println(orderDTO);
}注意点
Hutool BeanUtil使用的是深拷贝。

运行时如报如下错,需要添加vm参数。

shell
--add-opens java.base/java.lang=ALL-UNNAMEDMapStruct
- 代码编译时生成bean属性复制的代理,运行期间无需使用反射或字节码技,具有高性能
- 深拷贝
依赖坐标
xml
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>使用案例
1. 定义转换接口
java
import org.mapstruct.Mapper;
/*
定义转换接口
*/
@Mapper
public interface ConvertMapper {
OrderDTO orderPO2OrderDTO(OrderPO orderPO);
}2. 使用Mapper接口
java
@Test
public void mapstructTest() {
OrderPO orderPO = new OrderPO();
orderPO.setId(1);
orderPO.setOrderNumber("orderNumber 123456");
ArrayList<String> proIds = new ArrayList<String>();
proIds.add("productID 1");
proIds.add("productID 2");
proIds.add("productID 3");
orderPO.setProId(proIds);
ConvertMapper mapper = Mappers.getMapper(ConvertMapper.class);
OrderDTO orderDTO = mapper.orderPO2OrderDTO(orderPO);
System.out.println(orderPO);
System.out.println(orderDTO);
}注意点
- MapStruct使用的是深拷贝。

- 自动编译后的实现类。

Dozer
Dozer是一个Bean到Bean映射器,它以递归方式将数据从一个对象复制到另一个对象,并且这些Bean可以具有不同的复杂类型。
- 深拷贝
依赖坐标
xml
<!--Dozer-->
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>使用案例
java
@Test
public void dozerTest() {
OrderPO orderPO = new OrderPO();
orderPO.setId(1);
orderPO.setOrderNumber("orderNumber 123456");
ArrayList<String> proIds = new ArrayList<String>();
proIds.add("productID 1");
proIds.add("productID 2");
proIds.add("productID 3");
orderPO.setProId(proIds);
DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();
OrderDTO orderDTO = dozerBeanMapper.map(orderPO, OrderDTO.class);
System.out.println(orderPO);
System.out.println(orderDTO);
}注意点
- Dozer使用的是深拷贝。
