Orika 是 Java 中一个易于使用和可扩展的对象映射框架

Orika 是一个 Java 对象映射框架,允许将一个类的属性值映射到另一个类实例的属性值,同时具有良好的性能和易用性。对于开发人员而言,大多数映射需求都可以通过 Orika 来实现。 Orika 还提供了许多定制选项和非常详细的文档供使用者参考。除此之外,它还是一个开源框架,所以可以轻松找到维护者和用户社区。

一、Orika 概述

Orika 框架是由手头忙于 Spring Boot 后端开发的开发者由于复杂对象转换等问题创造的。Orika 的目标是提供一个使用简单,性能优良,扩展性好的框架。Orika 是在 Apache License 下发布的。

Orika 可以在任何 Java 应用程序中使用,并在性能上优于其他大多数映射框架。 Orika 不仅仅只是映射简单的属性。 Orika 还支持从一个映射中排除某些字段,包含复杂集合的处理方式等等。

二、Orika 的使用

为了在应用程序中使用 Orika,您需要使用 Maven 或 Gradle 获得 Orika 依赖。以下是 Maven 的配置示例:

    <dependency>
        <groupId>ma.glasnost.orika</groupId>
        <artifactId>orika-core</artifactId>
        <version>1.5.2</version>
    </dependency>

使用 Orika 非常简单。你需要创建一个 MapperFactory,这个 MapperFactory 用来构造 Mapper 实例。

    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();

构建 MapperFactory 对象后,你可以从 MapperFactory 中获取一个实例化的 Mapper,同时使用 MapStruct 注解 来自动生成 Mapper 接口:

    @Mapper
    public interface PersonMapper {
        @Mapping(source = "firstName", target = "name")
        PersonDto personToPersonDto(Person person);
        Person personDtoToPerson(PersonDto personDto);
    }

    PersonMapper personMapper = mapperFactory.getMapperFacade(PersonMapper.class);

在这个例子中,我们将 Person 对象转变为 PersonDto 对象。注册 Mapper 是一个非常显式的过程,这使得 Orika 的行为和获得基本类型的映射器非常相似。

三、Orika 的性能

由于 Orika 的核心是映射对象,因此它的性能是非常重要的。 Orika 实现的关键在于,它在映射两个对象时,不会反射获取目标属 性的名称和类型。取而代之的是,它将映射分解为类似于一个转换表的方法,其中每个属性都被处理为一个映射。 Orika 在内部使用了一个 HashTable 来存储已经进行过映射的类,因此它能够缓存这个信息,以便下次使用这个类时,能快速地找到属性映射和构造函数。

性能测试的例子是,将含有一千万个对象的列表进行映射:

    List<Person> persons = createPersons(10000000);
    List<PersonDto> dtos;

    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    PersonMapper mapper = mapperFactory.getMapperFacade(PersonMapper.class);

    long t1 = System.currentTimeMillis();
    dtos = mapperFacade.mapAsList(persons, PersonDto.class);
    long t2 = System.currentTimeMillis();
    System.out.println("Orika takes " + (t2 - t1) + "ms to map " + persons.size() + " objects");

在我的笔记本电脑上,基于 Orika 的这种映射方式大约需要 4 秒钟。结果显示 Orika 的速度非常快,可以很好地处理10万以上的对象列表。

四、Orika 的高级功能

Orika 提供了一系列高级映射选项。这些是常用选项的一个子集:

  • 映射的上下文:此功能允许您从 MapperFacade 中的全局映射中获取更多的信息,例如当前的目标对象。
  • 自定义映射:您可以通过自定义转换器来扩展到其他类型。这对于处理复杂类型很有用,例如将文本转换为日期。
  • 嵌套映射:Orika 可以从一个带嵌套对象的源映射到带嵌套对象的目标。
  • 忽略特定属性。

在以下示例中,我将演示如何在 Orika 中使用自定义转换器和嵌套映射。

考虑以下两个类:

    public class Person {
        private String name;
        private String lastName;
        private LocalDate birthDate;
    }

    public class PersonDto {
        private String name;
        private String lastName;
        private String formattedBirthDate;
    }

我们将使用自定义转换器将 LocalDate 转换为字符串。

    mapperFactory.getConverterFactory().registerConverter(new CustomDateConverter());

自定义转换器:

    public class CustomDateConverter extends BidirectionalConverter<LocalDate, String> {
        @Override
        public String convertTo(LocalDate localDate, Type<? extends String> type, MappingContext mappingContext) {
            return localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        }

        @Override
        public LocalDate convertFrom(String s, Type<? extends LocalDate> type, MappingContext mappingContext) {
            return LocalDate.parse(s, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        }
    }

我们需要映射 Person -> PersonDto,现在我们可以使用自定义转换器了:

    @Mapper
    public interface PersonMapper {
        @Mappings({
                @Mapping(source = "firstName", target = "name"),
                @Mapping(source = "lastName", target = "lastName"),
                @Mapping(source = "birthDate", target = "formattedBirthDate", converter = CustomDateConverter.class)
        })
        PersonDto personToPersonDto(Person person);
    }

现在我们将演示如何处理映射嵌套对象的情况。我们再添加一个 Student 类,其内部包含一个 Person 类型的属性以及其他属性:

    public class Student {
        private Person person;
        //Other properties
    }

我们将使用另一个 Mapper(用于将 Person 映射到 PersonDto ),然后在 StudentMapper 中引用它并进行嵌套映射。我们还将完成对 Person 和 Student 的映射。

    @Mapper
    public interface StudentMapper {
        @Mapping(source = "person", target = "personDto")
        StudentDto studentToStudentDto(Student student);

        @Mapping(source = "name", target = "name")
        PersonDto personToPersonDto(Person person);
    }

注意,我们使用了 @Mapping(source = “person”, target = “personDto”) 将 Person 映射到 PersonDto 。在 StudentDto 中,我们使用的是新的转换字段 personDto 。

总结

Orika 是一个简单易用、高性能、支持高级映射选项的 Java 映射框架。您可以通过 Maven 或 Gradle 获得 Orika,同时 Orika 在性能上优于其他大多数映射框架,可以帮助开发者更快速地编写应用程序,同时极大提升了开发工作的便捷性。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/186462.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-11-27 05:46
下一篇 2024-11-27 05:46

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Ojlat:一款快速开发Web应用程序的框架

    Ojlat是一款用于快速开发Web应用程序的框架。它的主要特点是高效、易用、可扩展且功能齐全。通过Ojlat,开发人员可以轻松地构建出高质量的Web应用程序。本文将从多个方面对Oj…

    编程 2025-04-29
  • Zlios——一个多功能的开发框架

    你是否在开发过程中常常遇到同样的问题,需要不断去寻找解决方案?你是否想要一个多功能、易于使用的开发框架来解决这些问题?那么,Zlios就是你需要的框架。 一、简介 Zlios是一个…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29

发表回复

登录后才能评论