这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
基本操作
-
创建一个
MapperFacade
MapperFacade 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);
复制代码