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/zh-hk/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

發表回復

登錄後才能評論