java開發中DTO、VO、PO之間的轉換你應該這麼操作


痛點


一種框架的出現都要解決個痛點,我想下面這這種不方便的操作經常有人寫吧。

假如Car 類是數據庫映射類

CarDTO是DTO 類


通常我們會這麼寫一個方法進行轉換



甚至中間還牽涉了很多類型轉換,嵌套之類的繁瑣操作,而我們想要的只是建立它們之間的映射關係而已。有沒有一種通用的映射工具來幫我們搞定這一切。當然有而且還不少。有人說apache的BeanUtil.copyProperties 可以實現,但是性能差而且容易出異常,很多規範嚴禁使用這種途徑。以下是對幾種對象映射框架的對比,大多數情況下 MapStruct 性能最高。類似於lombok ,Mapstruct都是在編譯期進行實現,所以一般不存在運行時性能問題。

so,今天就搞一搞MapStruct, 無論是idea 還是eclipse 都建議安裝 mapstruct 插件。


安裝


引入maven 依賴座標


編寫映射


我們把開始的痛點解決一下,編寫Car到CarDTO的映射。


聲明一個映射接口用@org.mapstruct.Mapper 標記,說明這是一個bean轉換接口。這裏我們聲明瞭一個 CAR_MAPPING  來方便我們調用,CarDTO toCarDTO(Car car)是不是很熟悉, 像mybatis一樣抽象出我們的轉換方法。org.mapstruct.Mapping註解用來聲明成員屬性的映射。這裏以成員變量的參數名爲依據,如果有嵌套比如Car裏面有個CarType類型的成員變量type,其type屬性 來映射CarDTO中的type字符串,我們使用type.type 來獲取屬性值。如果有多層以此類推。mapStruct 最終調用的是setter和getter 方法,而非反射。這也是其性能比較好的原因之一。numberOfSeats 映射到seatCount 就比較好理解了。我們是不是忘記了一個屬性make,因爲他們的位置且名稱完全一致,所以可以省略。而且對於包裝類是自動拆箱封箱操作的,並且是線程安全的。MapStruct不單單有這些功能,還有其他一些複雜的功能:


  • 設置轉換默認值和常量。當目標值是null 我們可以設置其默認值,注意這些都是基本類型以及對應都boxing類型,如下


@Mapping(target = "stringProperty", source = "stringProp", defaultValue = "undefined")


需要注意的是常量不能對源進行引用(不能指定source屬性),下面是正確的操作

@Mapping(target = "stringConstant", constant = "Constant Value")


  • 格式化也是我們經常使用的操作,比如數字格式化,日期格式化。

  這是處理數字格式化的操作,遵循java.text.DecimalFormat的規範

           @Mapping(source = "price", numberFormat = "$#.00")

  下面展示了將一個日期集合映射到日期字符串集合的格式化操作上,遵循的

         @IterableMapping(dateFormat = "dd.MM.yyyy")

   List<String> stringListToDateList(List<Date> dates);

   

  • 我們還經常使用spring component 來處理  我們只需要這麼聲明,不用再構建一個單例,就可以像其他 spring bean一樣對CarMapping 進行引用了。



總結


其實MapStruct 還有很多的功能。但是從可讀性來說,我建議使用以上幾種容易理解的功能即可。如果你感興趣可以去mapstruct.org進一步學習。配合lombok和我介紹的jsr303教程,讓你更加專注於業務,而且代碼更加清晰。


下方查看 歷史文章

讓你的代碼更加簡練,springboot使用JSR303校驗

10分鐘就能輕鬆入門消息中間件rabbitmq(附帶教學源碼)

精選github開源的重量級精品java教程,學會這個你敢說你精通java





本文分享自微信公衆號 - 碼農小胖哥(Felordcn)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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