關(guān)于MapStruct的使用教程
MapStruct的使用
MapStruct 是一個(gè)代碼生成器,它使用注解處理器來實(shí)現(xiàn) Java bean 之間的映射。
MapStruct 通過在編譯時(shí)自動(dòng)生成映射代碼,減少了手動(dòng)編寫映射代碼的工作量,并幫助保持代碼的一致性和準(zhǔn)確性。
以下是 MapStruct 的基本使用方法:
1. 添加依賴
首先,你需要在項(xiàng)目的構(gòu)建配置中添加 MapStruct 的依賴。對(duì)于 Maven 和 Gradle,添加如下依賴:
- Maven:
<dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
- Gradle:
dependencies { implementation 'org.mapstruct:mapstruct:1.4.2.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' }
2. 定義映射接口
創(chuàng)建一個(gè)接口,并使用 @Mapper
注解標(biāo)注,這個(gè)接口將定義源對(duì)象和目標(biāo)對(duì)象之間的映射規(guī)則。
import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @Mapper public interface MyMapper { MyMapper INSTANCE = Mappers.getMapper(MyMapper.class); // 定義從源對(duì)象到目標(biāo)對(duì)象的映射方法 TargetObject map(SourceObject source); }
3. 使用映射方法
在業(yè)務(wù)邏輯中,你可以使用定義的映射接口來轉(zhuǎn)換對(duì)象。
public class MyService { public TargetObject convert(SourceObject source) { return MyMapper.INSTANCE.map(source); } }
4. 定義自定義映射方法
如果需要自定義映射邏輯,可以定義一個(gè)帶有 @Mapping
注解的方法,并在其中指定映射規(guī)則。
@Mapper public interface MyMapper { @Mapping(target = "targetProperty", source = "sourceProperty") @Mapping(target = "targetProperty2", expression = "java(String.valueOf(source.getSourceProperty2()))") TargetObject map(SourceObject source); }
5. 處理復(fù)雜映射
在這個(gè)例子中,@Mapping
注解用于指定源對(duì)象和目標(biāo)對(duì)象之間的屬性映射關(guān)系。source
屬性指定源對(duì)象的屬性名,target
屬性指定目標(biāo)對(duì)象的屬性名。
@Mapper public interface MyMapper { @Mapping(target = "dateOfBirth", source = "birthYear", qualifiedByName = "yearToCalendar") TargetObject map(SourceObject source); @Named("yearToCalendar") default Date yearToCalendar(int year) { Calendar calendar = Calendar.getInstance(); calendar.set(year, Calendar.JANUARY, 1); return calendar.getTime(); } }
對(duì)于更復(fù)雜的映射場(chǎng)景,比如需要轉(zhuǎn)換數(shù)據(jù)類型或者調(diào)用方法,MapStruct 也提供了相應(yīng)的注解來支持。
- 自定義映射:可以使用
@Mapping
注解的expression
或qualifiedByName
屬性來自定義映射邏輯。 - 集合映射:可以使用
@IterableMapping
和@MapMapping
注解來處理集合類型的映射。 - 枚舉映射:可以直接映射枚舉類型,或者通過
@Mapping
注解的enumNamed
屬性來指定枚舉的映射規(guī)則。 - 使用構(gòu)造函數(shù)映射:如果目標(biāo)類有構(gòu)造函數(shù),可以使用
@Mapping
注解的constructor
屬性來指定使用構(gòu)造函數(shù)進(jìn)行映射。 - 嵌套屬性映射:可以映射嵌套的對(duì)象屬性。
- 反向映射:可以定義一個(gè)反向映射方法,并使用
@Mapping
注解的inverse
屬性來引用正向映射方法。 - 使用裝飾器增強(qiáng)Mapper:可以使用
@DecoratedWith
注解來裝飾Mapper接口,以實(shí)現(xiàn)更復(fù)雜的映射邏輯。 - 映射繼承:可以通過繼承來共享映射配置。
- 使用@BeforeMapping和@AfterMapping進(jìn)行預(yù)處理和后處理:可以在映射方法執(zhí)行前后執(zhí)行自定義的邏輯。
- 使用@Context傳遞上下文參數(shù):可以在映射方法中傳遞額外的上下文參數(shù)。
6. 集成 Spring
MapStruct還可以與Spring框架集成,允許在映射器中注入Spring管理的bean。
這需要在Mapper接口上使用@Mapper(componentModel = "spring")
注解來指定Spring作為組件模型。然后,可以使用@Autowired
注解來注入Spring管理的bean。
@Mapper(componentModel = "spring") public interface MyMapper { TargetObject map(SourceObject source); }
這樣,MapStruct 映射器就可以作為 Spring Bean 進(jìn)行自動(dòng)裝配。
通過使用 MapStruct,你可以減少手動(dòng)編寫的樣板代碼,提高開發(fā)效率,并減少因手動(dòng)映射而產(chǎn)生的錯(cuò)誤。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA安裝阿里巴巴編碼規(guī)范插件的兩種方式詳解(在線安裝和離線安裝)
這篇文章主要介紹了IDEA安裝阿里巴巴編碼規(guī)范插件的兩種方式詳解(在線安裝和離線安裝),本文通過截圖給大家展示的非常詳細(xì),需要的朋友可以參考下2021-09-09Maven中Could not find artifact XXXX的錯(cuò)誤解決
本文主要介紹了Maven中Could not find artifact XXXX的錯(cuò)誤解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03在SpringBoot中,如何使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用方法總結(jié)
我們?cè)谶M(jìn)行網(wǎng)絡(luò)連接的時(shí)候,建立套接字連接是一個(gè)非常消耗性能的事情,特別是在分布式的情況下,用線程池去保持多個(gè)客戶端連接,是一種非常消耗線程的行為.那么我們?cè)撏ㄟ^什么技術(shù)去解決上述的問題呢,那么就不得不提一個(gè)網(wǎng)絡(luò)連接的利器——Netty,需要的朋友可以參考下2021-06-06Spring Boot與Spring Security的跨域問題解決方案
跨域問題是指在Web開發(fā)中,瀏覽器出于安全考慮,限制了不同域名之間的資源訪問,本文重點(diǎn)給大家介紹Spring Boot與Spring Security的跨域問題解決方案,感興趣的朋友一起看看吧2023-09-09MyBatis如何實(shí)現(xiàn)多表查詢(多對(duì)一、一對(duì)多)
這篇文章主要給大家介紹了關(guān)于MyBatis如何實(shí)現(xiàn)多表查詢(多對(duì)一、一對(duì)多)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05解決java數(shù)值范圍以及float與double精度丟失的問題
下面小編就為大家?guī)硪黄鉀Qjava數(shù)值范圍以及float與double精度丟失的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06