Java Bean 映射工具有很多,这里举例几类使用感受最好的
可以使用org.springframework.beans.BeanUtils
的copyProperties
方法
1.假设有以下两个 Java Bean 类:
public class Person {
private String name;
private int age;
// 省略 getter 和 setter 方法
}
public class PersonDTO {
private String name;
private int age;
// 省略 getter 和 setter 方法
}
2.复制属性值
Person person = new Person();
person.setName("张三");
person.setAge(20);
PersonDTO dto = new PersonDTO();
BeanUtils.copyProperties(person, dto);
System.out.println(dto.getName()); // 输出:张三
System.out.println(dto.getAge()); // 输出:20
需要注意的是,copyProperties 方法只会复制两个对象中属性名相同且类型相同的属性值。如果两个对象中存在属性名相同但类型不同的属性,则会抛出 org.springframework.beans.BeanInstantiationException 异常。如果两个对象中存在属性名不同的属性,可以通过 org.springframework.beans.BeanUtils 的 copyProperties(Object source, Object target, String… ignoreProperties) 方法来忽略不需要复制的属性。
如何解决BeanUtils.copyProperties方法覆盖字段为null,看这一篇就够了~~
<!-- MapStruct 核心依赖 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!-- MapStruct 注解处理器 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
<scope>provided</scope> // 需要注意的是,mapstruct-processor 依赖的 scope 属性必须设置为 provided,以便在编译时生成代码,并在运行时不包含在项目中
</dependency>
以下是使用 org.mapstruct.mapper 进行复杂映射的一个简单示例:
假设有以下两个 Java Bean 类:
public class Person {
private String name;
private int age;
private Address address;
// 省略 getter 和 setter 方法
}
public class PersonDTO {
private String name;
private int age;
private String city;
// 省略 getter 和 setter 方法
}
public class Address {
private String city;
private String street;
// 省略 getter 和 setter 方法
}
Person 和 PersonDTO 之间的映射比较复杂,需要将 Person 中的 Address 对象的 city 属性映射到 PersonDTO 中的 city 属性。可以通过编写注解来指定映射关系,例如:
@Mapper
public interface PersonMapper {
@Mapping(source = "address.city", target = "city")
PersonDTO personToPersonDTO(Person person);
}
在上述代码中,@Mapper 注解表示这是一个 MapStruct 的 Mapper 接口,@Mapping 注解表示 Person 中的 address.city 属性应该映射到 PersonDTO 的 city 属性中。在实际使用时,可以通过调用 PersonMapper 接口中的 personToPersonDTO 方法来进行 Person 和 PersonDTO 之间的映射:
PersonMapper mapper = Mappers.getMapper(PersonMapper.class);
Person person = new Person();
person.setName("张三");
person.setAge(20);
Address address = new Address();
address.setCity("北京");
address.setStreet("长安街");
person.setAddress(address);
PersonDTO personDTO = mapper.personToPersonDTO(person);
在上述代码中,Mappers.getMapper() 方法用于获取 PersonMapper 接口的实现类,personToPersonDTO 方法用于将 Person 对象映射为 PersonDTO 对象。在映射过程中,MapStruct 会自动根据注解中的映射关系将 Person 中的属性值复制到 PersonDTO 中,从而实现复杂映射。
可以使用cn.hutool.core.bean.BeanUtil.copyToList()
方法
maven依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.7.10</version>
</dependency>
举例:
List<Person> list1 = ...
List<PersonDTO> list2= BeanUtil.copyToList(list1, PersonDTO.class);
需要注意的是,copyToList 方法只会复制两个对象中属性名相同且类型相同的属性值。如果两个对象中存在属性名相同但类型不同的属性,则会抛出 java.lang.IllegalArgumentException 异常。如果两个对象中存在属性名不同的属性,可以通过 BeanUtil.copyProperties 方法对每个对象进行单独的复制。
没错是org.mapstruct.mapper,他又来了,他也支持映射集合
public class Person {
private String name;
private int age;
// 省略 getter 和 setter 方法
}
public class PersonDTO {
private String name;
private int age;
// 省略 getter 和 setter 方法
}
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
List<PersonDTO> toPersonDTOList(List<Person> personList);
}
方法中的 INSTANCE 常量用于获取映射器的实例。
List<Person> personList = new ArrayList<>();
Person person1 = new Person();
person1.setName("张三");
person1.setAge(20);
personList.add(person1);
Person person2 = new Person();
person2.setName("李四");
person2.setAge(30);
personList.add(person2);
List<PersonDTO> dtoList = PersonMapper.INSTANCE.toPersonDTOList(personList);
使用 PersonMapper.INSTANCE.toPersonDTOList 方法将 personList 转换为 PersonDTO 对象列表。方法返回转换后的目标对象列表,其中包含两个 PersonDTO 对象,其属性值与源对象相同。
需要注意的是,映射器会自动处理源对象列表和目标对象列表之间的映射关系,无需对每个对象进行单独的转换。如果两个对象中存在属性名相同但类型不同的属性,则需要定义相应的类型转换器。