最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中MapStruct入門使用及對比

 更新時間:2023年12月06日 09:57:24   作者:檀越劍指大廠  
MapStruct是一個Java注解處理器框架,用于簡化Java Bean之間的映射,本文主要介紹了Java中MapStruct入門使用及對比,感興趣的可以了解一下

一.簡單介紹

1.什么是 MapStruct?

MapStruct 是一個 Java 注解處理器框架,用于簡化 Java Bean 之間的映射。它通過生成映射代碼來消除手動編寫映射代碼的繁瑣工作,從而提高開發(fā)效率。

2.MapStruct 的特點

  • 簡化映射: MapStruct 旨在簡化 Java Bean 之間的映射,減少手動編寫映射代碼的工作量。
  • 注解處理器: MapStruct 使用注解處理器技術(shù),在編譯時生成映射代碼,而不是在運行時進行反射。
  • 類型安全: 通過在映射接口上使用注解,MapStruct 能夠在編譯時檢查映射的正確性,提供類型安全性。
  • 支持自定義映射邏輯: 盡管 MapStruct 提供了默認的映射規(guī)則,但你仍然可以通過在映射接口中定義自定義方法來指定特定的映射邏輯。

二.基礎(chǔ)使用

1.添加依賴

添加依賴: 首先,在你的項目中添加 MapStruct 的依賴。你可以在 Maven 或 Gradle 中進行配置。

Maven:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version> <!-- 使用最新版本 -->
</dependency>

Gradle:

implementation 'org.mapstruct:mapstruct:1.4.2.Final' // 使用最新版本
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'

2.定義映射接口

定義映射接口: 創(chuàng)建一個帶有@Mapper注解的接口,定義映射方法。

@Mapper
public interface CarMapper {
    CarDto carToCarDto(Car car);
}

3.編寫配置

編寫映射配置: 如果需要自定義映射邏輯,可以在映射接口中定義自定義方法,或者使用@Mapping注解。

@Mapper
public interface CarMapper {
    @Mapping(source = "make", target = "manufacturer")
    CarDto carToCarDto(Car car);
}

4.生成代碼

生成映射代碼: 編譯項目時,MapStruct 注解處理器將生成映射代碼。

5.調(diào)用方法

調(diào)用映射方法: 在應(yīng)用程序中調(diào)用生成的映射方法。

CarMapper carMapper = Mappers.getMapper(CarMapper.class);
CarDto carDto = carMapper.carToCarDto(car);

以上是 MapStruct 的基本介紹和使用步驟。通過這些步驟,你可以輕松地實現(xiàn) Java Bean 之間的映射,同時保持代碼的簡潔和易維護性。

三.封裝使用

1.FromConverter

public interface FromConverter<T, FROM> {

    T from(FROM from);

    List<T> from(List<FROM> list);

    default PageBean<T> from(PageBean<FROM> page) {
        PageBean<T> result = new PageBean<>();
        result.setTotalElements(page.getTotalElements());
        result.setNumber(page.getNumber());
        result.setSize(page.getSize());
        result.setTotalPages(page.getTotalPages());
        result.setNumberOfElements(page.getNumberOfElements());
        result.setContent(this.from(page.getContent()));
        return result;
    }

    default PageBean<T> from(IPage<FROM> page) {
        PageBean<T> result = new PageBean<>();
        result.setTotalElements((int) page.getTotal());
        result.setNumber((int) page.getCurrent());
        result.setSize((int) page.getSize());
        result.setTotalPages((int) page.getPages());
        result.setNumberOfElements(page.getRecords().size());
        result.setContent(this.from(page.getRecords()));
        return result;
    }
}

2.PropertyCopier

public interface PropertyCopier<TARGET, T> {
    void copy(@MappingTarget TARGET target, T t);
}

3.ToConverter

public interface ToConverter<T, TO> {
    TO to(T t);

    List<TO> to(List<T> list);

    default PageBean<TO> to(PageBean<T> page) {
        PageBean<TO> result = new PageBean<>();
        result.setTotalElements(page.getTotalElements());
        result.setNumber(page.getNumber());
        result.setSize(page.getSize());
        result.setTotalPages(page.getTotalPages());
        result.setNumberOfElements(page.getNumberOfElements());
        result.setContent(this.to(page.getContent()));
        return result;
    }

    default PageBean<TO> to(IPage<T> page) {
        PageBean<TO> result = new PageBean<>();
        result.setTotalElements((int) page.getTotal());
        result.setNumber((int) page.getCurrent());
        result.setSize((int) page.getSize());
        result.setTotalPages((int) page.getPages());
        result.setNumberOfElements(page.getRecords().size());
        result.setContent(this.to(page.getRecords()));
        return result;
    }
}

4.TwoWayConverter

public interface TwoWayConverter<SRC, DEST> extends ToConverter<SRC, DEST>, FromConverter<SRC, DEST> {
}

5.基本使用

@Data
public class ChatbotDTO {

    private Integer id;
    private String question;
    private String response;
    private Date createTime;
    private Integer isDelete;

    @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
    public interface Converter extends FromConverter<ChatbotDTO, Chatbot> {
        Converter INSTANCE = Mappers.getMapper(Converter.class);
    }
}
@Data
public class Chatbot extends Model<Chatbot> {
    private Integer id;
    private String question;
    private String response;
    private Date createTime;
    private Integer isDelete;
}

6.原理分析

打開 target 目錄,可以看到如圖所示的編譯后生成的類,說明在編譯器就生成了對應(yīng)的 DTO,相比其他 2 種方式在運行時生成 DTO 更加高效。

7.使用技巧

  • 忽略字段映射
  • 源對象與目標對象屬性名不符的映射方法
  • 直接設(shè)置特定值
  • 表達式映射
  • 自定義映射

四.工具對比

1.概述

MapStruct、Apache BeanUtils 以及 Spring BeanUtils 都是用于 Java Bean 之間屬性復(fù)制的工具,但它們有一些區(qū)別,包括實現(xiàn)方式、性能、功能等方面。

2.MapStruct

優(yōu)勢:

  • 編譯時檢查: MapStruct 在編譯時生成映射代碼,提供了類型安全性,可以在編譯時捕獲一些映射錯誤。
  • 性能: 由于生成的映射代碼是直接的 Java 代碼,MapStruct 通常在性能上優(yōu)于運行時反射的解決方案。
  • 可配置性: 提供了很高的自定義能力,你可以在映射接口中定義自定義方法或使用@Mapping注解來指定映射規(guī)則。
  • MapStruct 能自動的將名字一樣,類型不一致的屬性值進行轉(zhuǎn)化再賦值(僅限基本類型的包裝類型,如果轉(zhuǎn)化值適配不了對應(yīng)類型會報錯

不足:

  • 學習曲線: 對于初學者而言,可能需要一些時間來理解和配置 MapStruct。

3.Apache BeanUtils

優(yōu)勢:

  • 簡單易用: Apache BeanUtils 提供了簡單的 API,易于上手。
  • 反射: 使用反射機制實現(xiàn)屬性復(fù)制,可以在運行時處理動態(tài)對象。

不足:

  • 性能: 相對于 MapStruct,Apache BeanUtils 在性能上可能較慢,因為它使用反射進行屬性復(fù)制。
  • 類型安全: 由于是在運行時進行反射,缺乏編譯時類型檢查。

4.Spring BeanUtils

優(yōu)勢:

  • 集成 Spring: Spring BeanUtils 是 Spring 框架的一部分,可以很容易地集成到 Spring 應(yīng)用程序中。
  • 簡化代碼: 提供了一些方便的方法,可以簡化屬性復(fù)制的代碼。

不足:

  • 性能: 與 Apache BeanUtils 類似,Spring BeanUtils 也是使用反射,因此性能相對較低。
  • 可配置性: 相較于 MapStruct,可配置性相對較低。

5.總結(jié):

  • MapStruct 提供了編譯時類型檢查和高度可配置性,適用于需要更高性能和更復(fù)雜映射規(guī)則的場景。

  • Apache BeanUtils 和 Spring BeanUtils 簡單易用,適用于簡單的屬性復(fù)制場景,但在性能和類型安全性方面可能相對較差。

選擇使用哪個工具取決于你的具體需求,如果性能和類型安全性是關(guān)鍵考慮因素,而且你愿意付出一些學習成本,那么 MapStruct 可能是一個更好的選擇。如果你需要一個簡單且易于使用的解決方案,并且性能要求不是很高,那么 Apache BeanUtils 或 Spring BeanUtils 可能是更合適的選擇。

到此這篇關(guān)于Java中MapStruct入門使用及對比的文章就介紹到這了,更多相關(guān)Java MapStruct內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis框架零基礎(chǔ)快速入門案例詳解

    MyBatis框架零基礎(chǔ)快速入門案例詳解

    MyBatis本是apache的一個開源項目iBatis,2010年這個項目由apache?software?foundation遷移到了google?code,并且改名為MyBatis。2013年11月遷移到Github。iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架
    2022-04-04
  • java的SimpleDateFormat線程不安全的幾種解決方案

    java的SimpleDateFormat線程不安全的幾種解決方案

    但我們知道SimpleDateFormat是線程不安全的,處理時要特別小心,要加鎖或者不能定義為static,要在方法內(nèi)new出對象,再進行格式化,本文就介紹了幾種方法,感興趣的可以了解一下
    2021-08-08
  • Java中的static關(guān)鍵字用法總結(jié)

    Java中的static關(guān)鍵字用法總結(jié)

    這篇文章主要介紹了Java中的static關(guān)鍵字用法總結(jié),static是Java50個關(guān)鍵字之一,static關(guān)鍵字可以用來修飾代碼塊表示靜態(tài)代碼塊,修飾成員變量表示全局靜態(tài)成員變量,修飾方法表示靜態(tài)方法,需要的朋友可以參考下
    2023-11-11
  • 老生常談java中的Future模式

    老生常談java中的Future模式

    下面小編就為大家?guī)硪黄仙U刯ava中的Future模式。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 如何使用 Spring Boot 和 Canal 實現(xiàn) MySQL 數(shù)據(jù)庫同步

    如何使用 Spring Boot 和 Canal 實現(xiàn) My

    本文介紹了如何使用SpringBoot和Canal實現(xiàn)MySQL數(shù)據(jù)庫之間的數(shù)據(jù)同步,通過配置主庫、創(chuàng)建Canal用戶、配置CanalServer以及開發(fā)SpringBoot客戶端,實現(xiàn)了將主庫的數(shù)據(jù)實時同步到多個從庫,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • java利用冒泡排序?qū)?shù)組進行排序

    java利用冒泡排序?qū)?shù)組進行排序

    這篇文章主要介紹了java利用冒泡排序?qū)?shù)組進行排序的方法,實例分析了冒泡排序的概念與java實現(xiàn)方法,以及java操作數(shù)組的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • java鏈式創(chuàng)建json對象的實現(xiàn)

    java鏈式創(chuàng)建json對象的實現(xiàn)

    本文主要介紹了java中如何通過最簡單的方式實現(xiàn)鏈式創(chuàng)建json對象,解決創(chuàng)建json代碼臃腫的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java JTable 實現(xiàn)日歷的示例

    Java JTable 實現(xiàn)日歷的示例

    這篇文章主要介紹了Java JTable 實現(xiàn)日歷的示例,幫助大家更好的理解和學習Java jtable的使用方法,感興趣的朋友可以了解下
    2020-10-10
  • HashMap的get()方法的NullPointerException問題

    HashMap的get()方法的NullPointerException問題

    這篇文章主要介紹了HashMap的get()方法的NullPointerException問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java數(shù)組和可變參數(shù)使用舉例詳解

    Java數(shù)組和可變參數(shù)使用舉例詳解

    Java中的可變參數(shù)和數(shù)組參數(shù)在使用上很相似,但它們在方法定義、調(diào)用方式以及編譯處理上有明顯區(qū)別,理解這些差異有助于寫出更清晰、安全的代碼,這篇文章主要介紹了Java數(shù)組和可變參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2026-05-05

最新評論

深州市| 育儿| 怀仁县| 南丰县| 突泉县| 宜川县| 江安县| 南投市| 靖西县| 闻喜县| 门源| 鹤山市| 金寨县| 榆林市| 汉沽区| 凌云县| 麟游县| 盐城市| 龙里县| 江源县| 邮箱| 东山县| 东方市| 理塘县| 韩城市| 岚皋县| 怀化市| 婺源县| 即墨市| 长汀县| 准格尔旗| 乌审旗| 平谷区| 蓝山县| 淳安县| 阜新| 昂仁县| 百色市| 玉门市| 霍山县| 马龙县|