Java Bean 映射工具

Java Bean 映射工具有很多,这里举例几类使用感受最好的

目录

  • 一、单个对象映射
    • 1、BeanUtils工具类
    • 2、org.mapstruct.mapper
  • 二、集合映射
    • 1、BeanUtil.copyToList()
    • 2、org.mapstruct.mapper

一、单个对象映射

1、BeanUtils工具类

可以使用org.springframework.beans.BeanUtilscopyProperties方法

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,看这一篇就够了~~

2、org.mapstruct.mapper

<!-- 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 中,从而实现复杂映射。

二、集合映射

1、BeanUtil.copyToList()

可以使用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 方法对每个对象进行单独的复制。

2、org.mapstruct.mapper

没错是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 对象,其属性值与源对象相同。
需要注意的是,映射器会自动处理源对象列表和目标对象列表之间的映射关系,无需对每个对象进行单独的转换。如果两个对象中存在属性名相同但类型不同的属性,则需要定义相应的类型转换器。

你可能感兴趣的:(Java,java,开发语言)