这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
基本操作
-
创建一个
MapperFacadeMapperFacade mapperFacade = new Builder().build().getMapperFacade(); -
使用该
MapperFacade对象进行任意的Bean转换ApproveSubmitRequest request = getRequest(); ApprovalEntry entry = mapperFacade.map(request, ApprovalEntry.class);
基本概念
MapperFactory: 映射工厂,用来定义转换规则(任何字段映射、注册转换器、自定义映射器、用于抽象/接口类型的具体类型)并生成MapperFacade
MapperFacade: 映射门面,进行对象转换的实际执行器
使用fluent风格的ClassMapBuilder API的声明性映射配置
基本的字段映射
转换规则是对MapperFactory对象定义的,以下面转换的规则为例
mapperFactory.classMap(BasicPerson.class, BasicPersonDto.class)
.field("name", "fullName")
.field("age", "currentAge")
.exclude("secretKey")
.byDefault()
.register();
classMap(A, B)方法定义了相互转换的类,不分源对象和目标对象。field("name", "fullName")表示AB类中name和fullName字段的双向映射,如果只想要A对象name赋值给B对象的fullName,则需要使用fieldAToB("fullName", "name")。byDefault()方法表示当AB对象的字段名一致时,自动赋值,如果没有该方法则不会赋值。exclude("secretKey")显示地排除了secretKey字段的赋值。
指定要使用的特定构造函数
orika 提供了constructorA和constructorB方法用于使用有参构造器生成新类,例如下面的代码中在生成A对象时优先使用构造方法public BasicPerson(Long id, String name)完成
mapperFactory.classMap(BasicPerson.class, BasicPersonDto.class)
.constructorA("id", "name")
...
.register();
数组和列表的映射元素
BasicPerson对象中将姓名作为列表存储,第一个元素为firstName,第二个元素为lastName,对于列表或数组,可以使用下面的语法进行字段值的转换。
mapperFactory.classMap(BasicPerson.class, BasicPersonDto.class)
.field("nameParts[0]", "firstName")
.field("nameParts[1]", "lastName")
.register();
映射嵌套字段
嵌套属性可以使用“.”来引用,例如BasicPerson中的姓名是一个对象private Name name,可以使用下面语法进行字段值的转换。
mapperFactory.classMap(BasicPerson.class, BasicPersonDto.class)
.field("name.first", "firstName")
.register();
使用BoundMapperFacade以获得更好的性能
如果需要频繁进行AB对象的转换,可以使用特定的BoundMapperFacade以追求更好的性能
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
// 设置该facade是由ApproveSubmitRequest向ApprovalEntry转换
BoundMapperFacade<ApproveSubmitRequest, ApprovalEntry> facade = mapperFactory
.getMapperFacade(ApproveSubmitRequest.class, ApprovalEntry.class);
// 进行字段映射
ApprovalEntry entry = facade.map(request);