Orika的基本用法

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

基本操作

  1. 创建一个MapperFacade

    MapperFacade mapperFacade = new Builder().build().getMapperFacade();
    复制代码
  2. 使用该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();
复制代码
  1. classMap(A, B)方法定义了相互转换的类,不分源对象和目标对象。
  2. field("name", "fullName")表示AB类中namefullName字段的双向映射,如果只想要A对象name赋值给B对象的fullName,则需要使用fieldAToB("fullName", "name")
  3. byDefault()方法表示当AB对象的字段名一致时,自动赋值,如果没有该方法则不会赋值。
  4. exclude("secretKey")显示地排除了secretKey字段的赋值。

指定要使用的特定构造函数

orika 提供了constructorAconstructorB方法用于使用有参构造器生成新类,例如下面的代码中在生成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);
复制代码

Guess you like

Origin juejin.im/post/7032648560525082655