spring中Mapstruct屬性映射的實(shí)現(xiàn)
整合 Mapstruct : 簡(jiǎn)化屬性映射
解決問(wèn)題:當(dāng)一個(gè)對(duì)象屬性過(guò)多時(shí),DO轉(zhuǎn)VO需要寫(xiě)的字段太多了
1. 什么是 MapStruct?
MapStruct 是一個(gè)用于簡(jiǎn)化 Java Bean 映射代碼的代碼生成器。它可以自動(dòng)生成在不同 Java 對(duì)象之間進(jìn)行映射的代碼,而無(wú)需手動(dòng)編寫(xiě)復(fù)雜的轉(zhuǎn)換邏輯。MapStruct 使得在 Java 應(yīng)用程序中進(jìn)行對(duì)象映射變得更加簡(jiǎn)單、高效、可維護(hù)。
2. 為什么要使用 MapStruct?
- 簡(jiǎn)化映射過(guò)程: 傳統(tǒng)的 Java 對(duì)象映射需要編寫(xiě)大量的重復(fù)、繁瑣的代碼。MapStruct 自動(dòng)生成這些映射代碼,節(jié)省了開(kāi)發(fā)人員的時(shí)間和精力。
- 類(lèi)型安全性: MapStruct 是基于編譯時(shí)的代碼生成,因此提供了類(lèi)型安全性。在編譯時(shí),它會(huì)檢查源對(duì)象和目標(biāo)對(duì)象的類(lèi)型,避免了運(yùn)行時(shí)的類(lèi)型錯(cuò)誤。
- 高性能: 由于 MapStruct 生成的代碼是高度優(yōu)化的,所以性能非常好。相比手動(dòng)編寫(xiě)的映射代碼,MapStruct 生成的代碼更加高效。
- 可維護(hù)性: 當(dāng)數(shù)據(jù)模型發(fā)生變化時(shí),手動(dòng)更新映射代碼可能會(huì)非常麻煩。MapStruct 能夠根據(jù)最新的數(shù)據(jù)模型自動(dòng)生成新的映射代碼,確保映射邏輯與數(shù)據(jù)模型保持同步。
- 靈活性: MapStruct 提供了豐富的配置選項(xiàng)和擴(kuò)展點(diǎn),可以滿(mǎn)足各種復(fù)雜映射場(chǎng)景的需求。你可以定制生成的代碼,以適應(yīng)特定的業(yè)務(wù)邏輯。
3. 添加依賴(lài)
多模塊中,在父工程模塊的pom.xm下
<!-- 版本號(hào)統(tǒng)一管理 -->
<properties>
// 省略...
<mapstruct.version>1.5.5.Final</mapstruct.version>
</properties>
<!-- 統(tǒng)一依賴(lài)管理 -->
<dependencyManagement>
<dependencies>
// 省略...
<!-- Mapstruct 屬性映射 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 統(tǒng)一插件管理 -->
<pluginManagement>
<plugins>
// 省略...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source> <!-- 根據(jù)你的 JDK 版本進(jìn)行調(diào)整 -->
<target>${java.version}</target> <!-- 根據(jù)你的 JDK 版本進(jìn)行調(diào)整 -->
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version> <!-- 使用時(shí)請(qǐng)檢查最新版本 -->
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
在需要使用的模塊中添加
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> </dependency>
在入口模塊添加編譯插件:
<build>
<plugins>
// 省略...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>4. IDEA 配置 Mapstruct
添加好了 MapStruct 依賴(lài)后,已經(jīng)可以確保項(xiàng)目中能夠正常使用 MapStruct 了。但是,為了在開(kāi)發(fā)過(guò)程中獲得更好的體驗(yàn),我們可以為 IDE 進(jìn)行一些配置,從而支持 MapStruct 的自動(dòng)代碼生成、代碼提示等功能。
4.1 啟用注解處理器
- 打開(kāi) IntelliJ IDEA,并加載你的項(xiàng)目。
- 打開(kāi)
File -> Settings (或 Preferences)。 - 在左側(cè)導(dǎo)航欄中選擇
Build, Execution, Deployment -> Compiler -> Annotation Processors。 - 勾選
Enable annotation processing。 - 在
Store generated sources relative to下拉列表中選擇Module content root。 - 點(diǎn)擊右下角
Apply按鈕應(yīng)用設(shè)置,然后,點(diǎn)擊ok按鈕關(guān)閉彈框。

4.2添加MapStruct插件
雖然這不是必需的,但 MapStruct 插件可以為你提供一些很有用的功能,例如代碼提示和自動(dòng)補(bǔ)全。
- 打開(kāi)
File -> Settings (或 Preferences)。 - 在左側(cè)選擇
Plugins。 - 在市場(chǎng) (Marketplace) 中搜索 “MapStruct” 并安裝它。
- 重啟 IntelliJ IDEA。
5. 添加 convert 接口
新建一個(gè) /convert 包,并創(chuàng)建一個(gè) BlogSettingsConvert 轉(zhuǎn)換接口,代碼如下:
@Mapper
public interface BlogSettingsConvert {
/**
* 初始化 convert 實(shí)例
*/
BlogSettingsConvert INSTANCE = Mappers.getMapper(BlogSettingsConvert.class);
/**
* 將 VO 轉(zhuǎn)化為 DO
* @param bean
* @return
*/
BlogSettingsDO convertVO2DO(UpdateBlogSettingsReqVO bean);
}
注意,接口類(lèi)上添加的 @Mapper 注解,導(dǎo)入自 org.mapstruct.Mapper, 別搞錯(cuò)了哦。
6. 使用 Mapstruct 來(lái)轉(zhuǎn)換
@Service
public class AdminBlogSettingsServiceImpl extends ServiceImpl<BlogSettingsMapper, BlogSettingsDO> implements AdminBlogSettingsService {
@Override
public Response updateBlogSettings(UpdateBlogSettingsReqVO updateBlogSettingsReqVO) {
// VO 轉(zhuǎn) DO
BlogSettingsDO blogSettingsDO = BlogSettingsConvert.INSTANCE.convertVO2DO(updateBlogSettingsReqVO);
blogSettingsDO.setId(1L);
// 保存或更新(當(dāng)數(shù)據(jù)庫(kù)中存在 ID 為 1 的記錄時(shí),則執(zhí)行更新操作,否則執(zhí)行插入操作)
saveOrUpdate(blogSettingsDO);
return Response.success();
}
}
ingsDO.setId(1L);
// 保存或更新(當(dāng)數(shù)據(jù)庫(kù)中存在 ID 為 1 的記錄時(shí),則執(zhí)行更新操作,否則執(zhí)行插入操作)
saveOrUpdate(blogSettingsDO);
return Response.success();
}
}
將 VO 類(lèi)轉(zhuǎn)換為了 DO 類(lèi),僅需要對(duì) VO 中沒(méi)有值的字段,如 ID 字段設(shè)置一下值即可
到此這篇關(guān)于spring中Mapstruct屬性映射的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)spring Mapstruct屬性映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JVM內(nèi)存區(qū)域劃分相關(guān)原理詳解
這篇文章主要介紹了JVM內(nèi)存區(qū)域劃分相關(guān)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Spring強(qiáng)大事務(wù)兼容數(shù)據(jù)庫(kù)多種組合解決業(yè)務(wù)需求
這篇文章主要為大家介紹了Spring強(qiáng)大事務(wù)兼容數(shù)據(jù)庫(kù)多種組合解決業(yè)務(wù)需求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Java 圖片與byte數(shù)組互相轉(zhuǎn)換實(shí)例
下面小編就為大家?guī)?lái)一篇Java 圖片與byte數(shù)組互相轉(zhuǎn)換實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(21)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
詳解Java如何實(shí)現(xiàn)與JS相同的Des加解密算法
這篇文章主要介紹了如何在Java中實(shí)現(xiàn)與JavaScript相同的DES(Data Encryption Standard)加解密算法,確保在兩個(gè)平臺(tái)之間可以無(wú)縫地傳遞加密信息,希望對(duì)大家有一定的幫助2025-04-04
[Java]詳解Socket和ServerSocket學(xué)習(xí)筆記
即時(shí)類(lèi)應(yīng)用或者即時(shí)類(lèi)的游戲,HTTP協(xié)議很多時(shí)候無(wú)法滿(mǎn)足于我們的需求,這會(huì),Socket對(duì)于我們來(lái)說(shuō)就非常實(shí)用了。本篇文章主要介紹了Socket和ServerSocket,有興趣的可以了解一下。2016-12-12

