文章目录
- 前情提要
- 一、导入MapStruct 依赖
- 二、Bean转换示例
- 三、参考链接
前情提要
MapStruct
是一个开源的基于Java的代码生成器,用于创建实现Java Bean之间转换的扩展映射器。使用MapStruct,我们只需要创建接口,而该库会通过注解在编译过程中自动创建具体的映射实现,大大减少了通常需要手工编写的样板代码的数量。
提示:以下是本篇文章正文内容,下面案例可供参考
一、导入MapStruct 依赖
使用Maven通过引入依赖安装MapStruct
<dependencies><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency>
</dependencies>
由于MapStruct在编译时工作,并且会集成到像Maven和Gradle这样的构建工具上,我们还必须在<build>
标签中添加一个插件maven-compiler-plugin
,并在其配置中添加annotationProcessorPaths
,该插件会在构建时生成对应的代码。
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.8</source><target>1.8</target><annotationProcessorPaths><!-- MapStruct 在编译时会通过这个插件生成代码 --><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></path></annotationProcessorPaths></configuration></plugin></plugins>
</build>
二、Bean转换示例
实体类1:CarPo
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarPo {private Integer id;private String brand;
}
实体类2:CarVo
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarVo {private Integer id;private String brand;
}
转换类:CarFactory
@UtilityClass
public class CarFactory {// 场景1:单个对象转换public static CarVo createConvertVo1(CarPo param) {return CarConvert.INSTANCE.toConvertVo1(param);}// 场景2:多个对象转换public static List<CarVo> createtoConvertVo2(List<CarPo> param) {return CarConvert.INSTANCE.toConvertVo2(param);}// 场景3:两个类型属性不一致,CarPo的一个属性为carName,而CarVo对应的属性为namepublic static CarVo createtoConvertVo3(CarPo param) {return CarConvert.INSTANCE.toConvertVo3(param);}// 场景4;类型不一致,CarPo加一个属性为Date类型的createTime,CarVo加一个属性为String类型的createTimepublic static CarVo createtoConvertVo4(CarPo param) {return CarConvert.INSTANCE.toConvertVo4(param);}// 场景5:两个Bean映射为一个Bean的情况,将CarPo和AttributePo同时映射为CarBo@Mapperpublic interface CarConvert {CarConvert INSTANCE = Mappers.getMapper(CarConvert.class);// 场景1:1对1CarVo toConvertVo1(CarPo param);// 场景2:n对nList<CarVo> toConvertVo2(List<CarPo> param);// 场景3:两个类型属性不一致@Mapping(source = "carName", target = "name")CarVo toConvertVo3(CarPo source);// 场景4:类型不一致@Mappings({@Mapping(source = "carName", target = "name"),@Mapping(target = "createTime", expression = "java(com.guduyan.util.DateUtil.dateToStr(source.getCreateTime()))")})CarVo toConvertVo4(CarPo source);// 场景5:n对1CarBo toConvertBo(CarPo source1, AttributePo source2);}
}
三、参考链接
本文内容比较简约,详细可参考如下文章。
1、POJO、PO、DTO、VO、BO到底是什么?都如何使用?(基础概念+传输示意图+示例代码)带你一次玩转层出不穷的Object
2、MapStruct使用指南
3、如何优雅的转换Bean对象