Java高效映射工具MapStruct的使用示例
作者:一只爱撸猫的程序猿
引言
MapStruct 是一个 Java 注解处理器,用于在不同 Java Beans 或数据传输对象(DTOs)之间自动生成类型安全的映射代码。这是一个编译时映射框架,意味着它利用注解在编译时生成代码,从而提高了性能和减少了运行时的开销。
它适用于 Java 8 和更高版本。以下是一些 MapStruct 的基本使用示例:
1. 基本映射
假设你有两个简单的类 Person
和 PersonDTO
,需要将 Person
实体映射到 PersonDTO
数据传输对象。
Person.java
public class Person { private String name; private int age; // getters and setters }
PersonDTO.java
public class PersonDTO { private String name; private int age; // getters and setters }
PersonMapper.java
@Mapper public interface PersonMapper { PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class); PersonDTO personToPersonDTO(Person person); }
2. 复杂类型映射
如果你的对象包含复杂类型或自定义类型,MapStruct 也可以处理这些。
Address.java
public class Address { private String street; private String city; // getters and setters }
Person.java (现在包含 Address)
public class Person { private String name; private int age; private Address address; // getters and setters }
PersonDTO.java (同样包含 Address)
public class PersonDTO { private String name; private int age; private String street; private String city; // getters and setters }
PersonMapper.java
@Mapper public interface PersonMapper { PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class); @Mapping(source = "address.street", target = "street") @Mapping(source = "address.city", target = "city") PersonDTO personToPersonDTO(Person person); }
3. 使用表达式
有时,你可能需要在映射过程中使用自定义逻辑。MapStruct 允许你使用 Java 表达式来实现这一点。
Person.java
public class Person { private String firstName; private String lastName; // getters and setters }
PersonDTO.java
public class PersonDTO { private String fullName; // getters and setters }
PersonMapper.java
@Mapper public interface PersonMapper { PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class); @Mapping(expression = "java(person.getFirstName() + ' ' + person.getLastName())", target = "fullName") PersonDTO personToPersonDTO(Person person); }
4. 使用自定义方法
在某些情况下,你可能需要自定义映射逻辑。你可以在映射器接口中定义自己的方法来实现这一点。
Person.java
public class Person { private String birthdate; // 假设这是一个字符串 // getters and setters }
PersonDTO.java
public class PersonDTO { private LocalDate birthdate; // 在 DTO 中,我们使用 LocalDate // getters and setters }
PersonMapper.java
@Mapper public interface PersonMapper { PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class); @Mapping(target = "birthdate", source = "birthdate", dateFormat = "yyyy-MM-dd") PersonDTO personToPersonDTO(Person person); default LocalDate stringToLocalDate(String date) { return LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")); } }
5. 映射集合
MapStruct 也能很好地处理集合映射。
PersonMapper.java
@Mapper public interface PersonMapper { PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class); List<PersonDTO> personsToPersonDTOs(List<Person> persons); }
6. 使用依赖注入
如果你使用 Spring 或类似框架,可以将 MapStruct 与依赖注入框架结合使用。
PersonMapper.java
@Mapper(componentModel = "spring") public interface PersonMapper { PersonDTO personToPersonDTO(Person person); }
使用 componentModel = "spring"
,MapStruct 将生成一个 Spring 组件,可以被注入到你的服务中。
7. 更新现有对象
MapStruct 也可以用于更新现有对象,而不是创建新的。
PersonMapper.java
@Mapper public interface PersonMapper { void updatePersonFromDTO(PersonDTO personDto, @MappingTarget Person person); }
这个方法将会根据 PersonDTO
中的数据更新一个已存在的 Person
对象,而不是创建一个新的。
8. 多源映射
你可以从多个源对象映射到一个目标对象。
Address.java
public class Address { private String city; // getters and setters }
PersonDTO.java
public class PersonDTO { private String name; private String city; // getters and setters }
PersonMapper.java
@Mapper public interface PersonMapper { @Mapping(source = "person.name", target = "name") @Mapping(source = "address.city", target = "city") PersonDTO personAndAddressToDTO(Person person, Address address); }
总结
MapStruct 的主要优点是它提供了一种高效、类型安全且易于使用的方式来自动化对象间的数据映射。这使得它成为处理 Java 应用中数据转换的理想选择,尤其是在涉及复杂对象和多层架构的场景中。通过减少手写的样板代码和提供清晰的映射定义,MapStruct 可以帮助开发人员节省时间,减少错误,并提高代码的可维护性。
以上就是Java注解处理器MapStruct的使用示例的详细内容,更多关于Java MapStruct使用的资料请关注脚本之家其它相关文章!