SpringBoot2.0實戰(7)整合MapStruct優雅地複製屬性

在之前章節的例子中,我們在接收參數的時候都是使用的 User 類對象,這是一個 DO 對象,是用於與數據庫進行交互的,而不是用於與前端業務進行交互的,所以需要創建一個 BO 業務對象用來與前端業務進行交互,保證數據隔離性及安全性。

接收參數換成了 BO 對象,但數據入庫使用的是 DO 對象,這中間就需要將 BO 對象的屬性複製到 DO 對象,然後代碼裏就會出現大量的 do.set(bo.get()),這讓代碼顯得臃腫,繁瑣。當然,通過反射或者是使用 Spring 提供的 BeanUtils.copyProperties() 等方法也可以達到簡化代碼的效果,但是在效率方面不盡如人意。

而 MapStruct 則提供了一種高效的解決方案,其實現方式是在編譯期,自動生成相關的 do.set(bo.get()) 代碼,所以,在運行期實際上就是直接調用原生的get/set 方法。

相關知識

MapStruct官網:http://mapstruct.org

課程目標

SpringBoot 整合 MapStruce 以及 Lombok

操作步驟

本文使用 Idea 集成開發環境

環境準備

安裝 MapStruce 插件

File -> settings,打開 Idea 的設置界面,從左側欄選擇 Plugins 選項,再在右側查詢 MapStruce,點擊安裝。

設置IDE

File -> Settings 打開設置界面,

選擇 Build,Execution,Deployment -> Compiler -> Annotation Processors 進入設置界面,

勾選 enable annotation processing

添加依賴

添加 mapstruct 的依賴

同時整合 Lombok,添加對 Lombok 的依賴

添加 mapstruct 的插件依賴,同時配置 Lombok

編碼

 

 

編寫 DTO 類,用於接收前端入參

編寫 Mappering 轉換器

 

  • 類上添加 @Mapper 註解,用於項目啓動時自動加載
  • 方法上添加 @Mapping 註解,用於設置轉換規則,source 設置源對象屬性,target 設置目標對象屬性,如果源對象屬性名與目標對象屬性名一致,則無需設置,在本例中,我們需要將 UserBO 對象的 mobile 屬性複製至 User 對象的 name 屬性中
  • 設置常量 INSTANCE,用於其它方法調用,也可以通過 Spring 的 IOC 進行注入

編寫 controller 接口

源碼地址

本章源碼 : https://github.com/caiyuanzi-song/boot.git

總結

MapStruct 釋放掉大量的屬性複製的代碼,改爲編譯時自動生成,所以只是精簡了項目代碼。

注意

項目編譯後,UserMapper 接口會在 target 目錄的相應路徑下生成一個 class 實現類,通過查看該實現類,可以看到實際生成的代碼結構。但是,在編碼過程中,如果修改了 UserMapper 接口內容,Idea 有時並不會重新編譯,導致最新的修改無法生效,必須得先對項目執行一次 clean 操作,清除掉 class 實現類,再次啓動時就會重新編譯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章