您現在的位置是:首頁 > 舞蹈首頁舞蹈

優雅,太優雅了!物件屬性複製你學會了麼?

由 老壇果凍兒 發表于 舞蹈2023-01-01
簡介接下來給大家介紹mapstruct的使用方法:比如我要實現將一個PetBO物件轉為PetVO物件,兩個物件id,name,masterName的屬性一致,需要將age複製到petAge,將type(String型別)屬性轉換成typeLis

word如何錄製宏並執行

在日常java開發中,我們常常需要定義不同層的物件,如BO、VO、DTO等,來保證不同層之間的低耦合,因此避不開對不同物件進行屬性複製操作。

優雅,太優雅了!物件屬性複製你學會了麼?

常見的複製方式分為兩種:

1。 手動使用setter方法進行賦值。(如果你只使用這種方式,老壇願稱你為勇士!!)

2。 使用前輩們發明好的工具類。常見的有BeanUtils、beanCopier、JSON,當然少不了我們今天的主角mapstruct!使用已經造好的輪子能大大提升我們的cv效率!

那麼我們就來先來看看今天的主角mapstruct如何使用,再和其他常見的工具類進行對比一下吧。

首先給大家簡單介紹一下mapstruct

mapstruct是一種實體類對映框架,透過Java註解將一個實體類的屬性安全地賦值給另一個實體類。只需要定義一個對映器介面,宣告需要對映的屬性,那麼在編譯過程中,mapstruct會自動生成該介面的實現類,實現將源物件對映到目標物件的效果。

mapstruct的特點如下:

1。 基於註解開發。開發簡單,易上手。

2。 安全性高。在編譯器就完成對映操作,如果編譯器能夠透過,在執行期就不會報錯。

3。 高效能,速度快。在執行期間直接呼叫實現類的方法,不需要在執行期間使用反射。

接下來給大家介紹mapstruct的使用方法:

比如我要實現將一個PetBO物件轉為PetVO物件,兩個物件id,name,masterName的屬性一致,需要將age複製到petAge,將type(String型別)屬性轉換成typeList(List型別),以及一個巢狀物件infoBO轉換成info:

優雅,太優雅了!物件屬性複製你學會了麼?

優雅,太優雅了!物件屬性複製你學會了麼?

其中InfoBO和InfoVO巢狀物件的屬性如下:

優雅,太優雅了!物件屬性複製你學會了麼?

實現轉化器只需要寫一個介面即可,如下所示:

優雅,太優雅了!物件屬性複製你學會了麼?

- 首先需要用@Mapper註解對這個介面進行修飾;

- 然後在方法上使用@Mapping註解,用來進行繫結對映關係,其中target是目標屬性,source是源屬性;

- 對於簡單的屬性型別相同,屬性名不同的情況,可以直接使用target和source進行繫結;

- 對於需要透過方法進行型別轉換的情況,需要使用expression來實現自定義屬性轉換,java表示使用的是java語法,convertToList是該介面中下方的自定義方法;

- 對於巢狀物件,在同一個介面中新增對應的轉換方法,並進行對應的屬性配置即可,如文中的convertInfo()

再寫一個測試類來驗證轉換是否成功:

優雅,太優雅了!物件屬性複製你學會了麼?

透過控制檯列印內容可以看到結果是符合預期的,結果如下:

BO::{“age”:2,“id”:“pet001”,“infoBO”:{“age”:22,“infoName”:“11”},“masterName”:“猿小白”,“name”:“小白”,“type”:“dog”}

VO::{“id”:“pet001”,“info”:{“age”:22,“name”:“11”},“masterName”:“猿小白”,“name”:“小白”,“petAge”:2,“typeList”:[“dog”]}

原理其實也不復雜,就是mapstruct根據我們的介面按照註解生成了一個實現類:

優雅,太優雅了!物件屬性複製你學會了麼?

對比

- BeanUtils

相信在業務程式碼中,最常見的就是BeanUtils。copyProperties(source,target),但是當出現屬性名稱不是完全一致的情況時,就只能手動進行get/set操作,這就無法避免的增加了工作量;另外需要注意的是BeanUtils中的複製是淺複製,比如源物件中的List屬性,複製到目標物件後,對這個List資料的修改會互相產生影響。

- BeanCopier

BeanCopier的使用方式如下:

優雅,太優雅了!物件屬性複製你學會了麼?

不同於BeanUtils 的反射,BeanCopier直接透過 BeanCopier。create 生成了一個代理類,透過位元組碼直接生成set/get方法。

但是BeanCopier針對屬性型別不同的情況需要做轉換需要使用convert()方法,有點麻煩。

- mapstruct

mapstruct將物件的轉換操作都放在介面中,精簡了業務程式碼,使得業務程式碼邏輯更簡潔清晰。

同時mapstruct不同於BeanUtils和BeanCopier,它是深複製。

另外mapstruct是呼叫生成的實現類中的get/set方法,效率接近原生,效率最高。

既然知道了mapstruct這麼多優點,那麼趕快在自己的專案中應用起來吧!