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)文章希望大家以后多多支持腳本之家!
- Java中MapStruct的使用詳解
- Java中MapStruct使用方法解析
- Java中的MapStruct知識點總結(jié)
- Java中的MapStruct的使用方法代碼實例
- Java中的MapStruct實現(xiàn)詳解
- Java高效映射工具MapStruct的使用示例
- Java中MapStruct映射處理器報錯的問題解決
- Java高性能實體類轉(zhuǎn)換工具MapStruct的使用教程詳解
- SpringBoot中MapStruct實現(xiàn)優(yōu)雅的數(shù)據(jù)復(fù)制
- SpringBoot使用MapStruct生成映射代碼的示例詳解
- MapStruct升級遇到的問題及解決方案
相關(guān)文章
java的SimpleDateFormat線程不安全的幾種解決方案
但我們知道SimpleDateFormat是線程不安全的,處理時要特別小心,要加鎖或者不能定義為static,要在方法內(nèi)new出對象,再進行格式化,本文就介紹了幾種方法,感興趣的可以了解一下2021-08-08
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
如何使用 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鏈式創(chuàng)建json對象的實現(xiàn)
本文主要介紹了java中如何通過最簡單的方式實現(xiàn)鏈式創(chuàng)建json對象,解決創(chuàng)建json代碼臃腫的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
HashMap的get()方法的NullPointerException問題
這篇文章主要介紹了HashMap的get()方法的NullPointerException問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

