建设医院网站ppt模板,学习php网站开发,怎么在百度推广自己的网站,网站做移动端老铁们是不是经常为写一些实体转换的原始代码感到头疼#xff0c;尤其是实体字段特别多的时候。介绍一个开源项目 mapstruct #xff0c;可以轻松优雅的进行转换#xff0c;简化你的代码。当然有的人喜欢写get set#xff0c;或者用BeanUtils 进行复制#xff0c;代码只是…老铁们是不是经常为写一些实体转换的原始代码感到头疼尤其是实体字段特别多的时候。介绍一个开源项目 mapstruct 可以轻松优雅的进行转换简化你的代码。当然有的人喜欢写get set或者用BeanUtils 进行复制代码只是工具本文只是提供一种思路。
先贴下官网地址吧https://mapstruct.org 一、MapStruct 的基本概念
映射器Mapper 在 MapStruct 中映射器是一个 Java 接口用于指定两个 JavaBean 之间的映射。映射器通常使用注解进行注释以指定映射器的输入类型和输出类型。映射器定义了转换的规则和逻辑。映射器工厂MapperFactory 映射器工厂是 MapStruct 中的核心组件之一。它负责创建映射器实例并维护映射器的缓存。在应用程序中通常只需要创建一个映射器工厂实例然后使用它来创建所有的映射器。映射器配置MapperConfig 映射器配置是 MapStruct 中的另一个核心组件用于指定映射器的行为和配置。在映射器配置中可以定义类型转换器、映射器实现类和其他映射器配置选项。映射器生命周期方法Lifecycle Methods 映射器生命周期方法是 MapStruct 提供的一个特性它允许在映射器实例创建和销毁时执行自定义逻辑。映射器生命周期方法可以用来进行一些初始化和清理工作。映射器选项Mapper Options 映射器选项是 MapStruct 提供的另一个特性它允许在映射器级别指定一些选项和配置。映射器选项可以用来控制映射器的行为和性能。 二、MapStruct 的使用
环境搭建
在使用 MapStruct 之前需要先配置环境。MapStruct 的最新版本可以在官网上下载。MapStruct 是一个注解处理器因此还需要将 MapStruct 添加到 Maven 或 Gradle 项目中。
映射器定义
定义一个映射器需要创建一个 Java 接口并使用 Mapper 注解注释它。在映射器接口中可以定义多个映射方法。每个映射方法的输入类型和输出类型必须在 Mapper 注解中进行声明。
例如假设有两个 JavaBean分别为 Person 和 PersonDto它们的属性如下
public class Person {private Long id;private String name;private int age;// getters and setters
}public class PersonDto {private Long id;private String fullName;private int age;// getters
}
假设需要将 Person 转换为 PersonDto可以定义一个映射器如下
Mapper
public interface PersonMapper {PersonMapper INSTANCE Mappers.getMapper( PersonMapper.class );Mapping(source name, target fullName)PersonDto personToDto(Person person);
}
在上面的代码中Mapper 注解指定了映射器的输入类型和输出类型。PersonMapper 接口中定义了一个映射方法 personToDto用于将 Person 对象转换为 PersonDto 对象。Mapping 注解指定了属性之间的映射关系。
映射器工厂创建
创建一个映射器工厂需要使用 MapStruct 提供的工厂类 Mappers。Mappers.getMapper() 方法接受一个映射器接口的 Class 对象作为参数并返回一个映射器实例。
例如可以使用以下代码创建 PersonMapper 实例
PersonMapper mapper PersonMapper.INSTANCE;
映射器使用
使用映射器进行转换只需要调用映射器的相应方法即可。例如可以使用以下代码将 Person 对象转换为 PersonDto 对象
Person person new Person();
person.setId(1L);
person.setName(John);
person.setAge(30);PersonDto personDto mapper.personToDto(person);
在上面的代码中创建了一个 Person 对象并设置了它的属性值。然后调用映射器的 personToDto 方法将 Person 对象转换为 PersonDto 对象。 映射器配置
可以使用 MapperConfig 注解定义一个映射器配置。在映射器配置中可以定义类型转换器、映射器实现类和其他映射器配置选项。映射器配置可以在映射器接口中进行引用从而影响映射器的行为和性能。
例如可以定义一个映射器配置如下
MapperConfig
public interface MyMapperConfig {Mappings({Mapping(source address.street, target street),Mapping(source address.city, target city),Mapping(source address.country, target country)})PersonDto personToDto(Person person);
}
在上面的代码中定义了一个 MyMapperConfig 配置类它包含一个 personToDto 映射器方法。在这个方法中使用 Mapping 注解指定了属性之间的映射关系。
可以在映射器接口中引用这个配置类如下所示
Mapper(config MyMapperConfig.class)
public interface PersonMapper {PersonMapper INSTANCE Mappers.getMapper( PersonMapper.class );PersonDto personToDto(Person person);
}在上面的代码中Mapper 注解中使用 config 属性引用了 MyMapperConfig 配置类。 高级特性
类型转换器
MapStruct 可以自动进行基本类型和常见类型的转换但是如果需要转换自定义类型或者复杂类型可以使用类型转换器。
类型转换器是一个静态方法接受一个参数并返回一个转换后的结果。例如可以定义一个将 LocalDate 转换为 Date 的类型转换器如下
javaCopy codepublic class DateMapper {public static Date toDate(LocalDate localDate) {return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());}
}在上面的代码中定义了一个 toDate 类型转换器它接受一个 LocalDate 参数并返回一个转换后的 Date 对象。
然后可以在映射器接口中使用 Mapper 的 uses 属性引用这个类型转换器如下所示
javaCopy codeMapper(uses DateMapper.class)
public interface PersonMapper {PersonDto personToDto(Person person);
}在上面的代码中Mapper 注解中使用 uses 属性引用了 DateMapper 类型转换器。 注解
MapStruct 支持自定义注解可以使用这些注解来控制映射器的行为。例如可以定义一个 UpperCase 注解用于将字符串属性转换为大写。
javaCopy codeTarget(ElementType.FIELD)
Retention(RetentionPolicy.CLASS)
public interface UpperCase {
}在上面的代码中定义了一个 UpperCase 注解它可以应用在字段上。
然后可以在映射器接口中使用 Mapping 注解的 qualifiedBy 属性引用这个注解如下所示
javaCopy codeMapper
public interface PersonMapper {Mapping(source name, target fullName, qualifiedBy UpperCase.class)PersonDto personToDto(Person person);
}在上面的代码中Mapping 注解中使用 qualifiedBy 属性引用了 UpperCase 注解。
最后需要定义一个 BeforeMapping 方法用于在映射之前将字符串属性转换为大写如下所示
javaCopy codeMapper
public interface PersonMapper {BeforeMappingdefault void toUpperCase(MappingTarget PersonDto personDto, MappingSource Person person) {personDto.setFullName(personDto.getFullName().toUpperCase());}Mapping(source name, target fullName, qualifiedBy UpperCase.class)PersonDto personToDto(Person person);
}在上面的代码中定义了一个 toUpperCase 方法在映射之前将 fullName 属性转换为大写。可以使用 BeforeMapping 注解标记这个方法并指定 MappingTarget 和 MappingSource 参数这样 MapStruct 就可以正确地注入映射器的输入和输出对象。