Java中MapStruct入門使用及對比
一.簡單介紹
1.什么是 MapStruct?
MapStruct 是一個 Java 注解處理器框架,用于簡化 Java Bean 之間的映射。它通過生成映射代碼來消除手動編寫映射代碼的繁瑣工作,從而提高開發(fā)效率。
2.MapStruct 的特點
- 簡化映射: MapStruct 旨在簡化 Java Bean 之間的映射,減少手動編寫映射代碼的工作量。
- 注解處理器: MapStruct 使用注解處理器技術,在編譯時生成映射代碼,而不是在運行時進行反射。
- 類型安全: 通過在映射接口上使用注解,MapStruct 能夠在編譯時檢查映射的正確性,提供類型安全性。
- 支持自定義映射邏輯: 盡管 MapStruct 提供了默認的映射規(guī)則,但你仍然可以通過在映射接口中定義自定義方法來指定特定的映射邏輯。
二.基礎使用
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)用映射方法: 在應用程序中調(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 目錄,可以看到如圖所示的編譯后生成的類,說明在編譯器就生成了對應的 DTO,相比其他 2 種方式在運行時生成 DTO 更加高效。
7.使用技巧
- 忽略字段映射
- 源對象與目標對象屬性名不符的映射方法
- 直接設置特定值
- 表達式映射
- 自定義映射
四.工具對比
1.概述
MapStruct、Apache BeanUtils 以及 Spring BeanUtils 都是用于 Java Bean 之間屬性復制的工具,但它們有一些區(qū)別,包括實現(xiàn)方式、性能、功能等方面。
2.MapStruct
優(yōu)勢:
- 編譯時檢查: MapStruct 在編譯時生成映射代碼,提供了類型安全性,可以在編譯時捕獲一些映射錯誤。
- 性能: 由于生成的映射代碼是直接的 Java 代碼,MapStruct 通常在性能上優(yōu)于運行時反射的解決方案。
- 可配置性: 提供了很高的自定義能力,你可以在映射接口中定義自定義方法或使用
@Mapping
注解來指定映射規(guī)則。 - MapStruct 能自動的將名字一樣,類型不一致的屬性值進行轉化再賦值(僅限基本類型的包裝類型,如果轉化值適配不了對應類型會報錯)
不足:
- 學習曲線: 對于初學者而言,可能需要一些時間來理解和配置 MapStruct。
3.Apache BeanUtils
優(yōu)勢:
- 簡單易用: Apache BeanUtils 提供了簡單的 API,易于上手。
- 反射: 使用反射機制實現(xiàn)屬性復制,可以在運行時處理動態(tài)對象。
不足:
- 性能: 相對于 MapStruct,Apache BeanUtils 在性能上可能較慢,因為它使用反射進行屬性復制。
- 類型安全: 由于是在運行時進行反射,缺乏編譯時類型檢查。
4.Spring BeanUtils
優(yōu)勢:
- 集成 Spring: Spring BeanUtils 是 Spring 框架的一部分,可以很容易地集成到 Spring 應用程序中。
- 簡化代碼: 提供了一些方便的方法,可以簡化屬性復制的代碼。
不足:
- 性能: 與 Apache BeanUtils 類似,Spring BeanUtils 也是使用反射,因此性能相對較低。
- 可配置性: 相較于 MapStruct,可配置性相對較低。
5.總結:
MapStruct 提供了編譯時類型檢查和高度可配置性,適用于需要更高性能和更復雜映射規(guī)則的場景。
Apache BeanUtils 和 Spring BeanUtils 簡單易用,適用于簡單的屬性復制場景,但在性能和類型安全性方面可能相對較差。
選擇使用哪個工具取決于你的具體需求,如果性能和類型安全性是關鍵考慮因素,而且你愿意付出一些學習成本,那么 MapStruct 可能是一個更好的選擇。如果你需要一個簡單且易于使用的解決方案,并且性能要求不是很高,那么 Apache BeanUtils 或 Spring BeanUtils 可能是更合適的選擇。
到此這篇關于Java中MapStruct入門使用及對比的文章就介紹到這了,更多相關Java MapStruct內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot+kaptcha實現(xiàn)圖片驗證碼功能詳解
這篇文章主要為大家詳細介紹了SpringBoot如何結合kaptcha實現(xiàn)圖片驗證碼功能,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下2024-01-01詳解如何在Spring Boot啟動后執(zhí)行指定代碼
這篇文章主要介紹了在Spring Boot啟動后執(zhí)行指定代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06java springboot郵箱找回密碼功能的實現(xiàn)講解
這篇文章主要介紹了java springboot郵箱找回密碼功能的實現(xiàn)講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01擴展Hibernate使用自定義數(shù)據(jù)庫連接池的方法
這篇文章主要介紹了擴展Hibernate使用自定義數(shù)據(jù)庫連接池的方法,涉及Hibernate數(shù)據(jù)庫操作擴展的相關技巧,需要的朋友可以參考下2016-03-03Java實現(xiàn)ZooKeeper的zNode監(jiān)控
這篇文章主要介紹了Java實現(xiàn)ZooKeeper的zNode監(jiān)控問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-08-08Java格式化輸出詳細講解(printf、print、println、format等)
Java的格式化輸出等同于String.Format,與C有很大的相似,下面這篇文章主要給大家介紹了關于Java格式化輸出(printf、print、println、format等)的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-03-03Spring MVC中處理ajax請求的跨域問題與注意事項詳解
跨域問題是我們大家在開發(fā)中會經(jīng)常遇到的一個問題,所以下面這篇文章主要給大家介紹了關于Spring MVC中處理ajax請求的跨域問題與注意事項的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2017-11-11