1. 程式人生 > >使用Mapstruct來進行domain實體與Entity模型之間的對映操作,減少類之間程式碼轉化

使用Mapstruct來進行domain實體與Entity模型之間的對映操作,減少類之間程式碼轉化

轉載地址:http://blog.csdn.net/lu_ckid/article/details/54602057

在一個成熟可維護的工程中,細分模組後,domian工程最好不要被其他工程依賴,但是實體類一般存於domain之中,這樣其他工程想獲取實體類資料時就需要在各自工程寫model,自定義model可以根據自身業務需要而並不需要對映整個實體屬性。

    mapstruct這個外掛就是用來處理domin實體類與model類的屬性對映,定義mapper介面,mapstruct就會自動的幫我們實現這個對映介面,避免了麻煩複雜的對映實現。

    工程中引入mapstruct依賴

  1. <!-- mapstruct -->
  2.   <dependency>
  3.       <groupId>org.mapstruct</groupId>
  4.       <artifactId>mapstruct-jdk8</artifactId>
  5.      <version>${org.mapstruct.version}</version>
  6.     </dependency>
  7.   </dependencies>

這裡定義實體Person
  1. publicclass Person {    
  2.     private
     String name;    
  3.     privateint age;    
  4.     private String phone;    
  5. }   

這裡定義模型PersonModel 
  1. publicclass PersonModel {    
  2.     private String name;    
  3.     privateint age;    
  4.     private String phone;    
  5. }  

定義實體Person與模型PersonModel,這裡兩個類的屬性一致。

定義對映可以使用介面也可以使用靜態類。

<1>使用介面對映:

    <a>簡單實體對映:

  1. @Mapper
  2. publicinterface PersonMapper {  
  3.     PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);  
  4.     PersonModel map( Person entity);  
  5.     List<PersonModel > map(List< Person> entity);  
  6. }  

這裡在PersonMapper 定義了兩個map方法,第一個是單實體對映,第二個方法是List對映。在存檔之後,mapstruct會自動在target檔案裡為我們實現我們定義的對映介面。
  1. @Generated(  
  2.     value = "org.mapstruct.ap.MappingProcessor",  
  3.     date = "2017-01-18T11:53:32+0800",  
  4.     comments = "version: 1.0.0.Final, compiler: Eclipse JDT (IDE) 1.2.0.v20150514-0146, environment: Java 1.8.0_31 (Oracle Corporation)"
  5. )  
  6. publicclass PersonMapperImpl implements PersonMapper {  
  7.     @Override
  8.     public PersonModel ma(Person entity) {  
  9.         if ( entity == null ) {  
  10.             returnnull;  
  11.         }  
  12.         PersonModel personModel = new PersonModel();  
  13.         personModel.setName( entity.getName() );  
  14.         personModel.setAge( entity.getAge() );  
  15.         personModel.setPhone( entity.gePhone() );  
  16.         return personModel;  
  17.     }  
  18.     @Override
  19.     public List<PersonModel> map(List<Person> entity) {  
  20.         if ( entity == null ) {  
  21.             returnnull;  
  22.         }  
  23.         List<PersonModel> list = new ArrayList<PersonModel>();  
  24.         for ( Person person : entity ) {  
  25.             list.add( map( person) );  
  26.         }  
  27.         return list;  
  28.     }  
  29. }  

在目標工程使用實體的時候只需要new一個PersonMapper的例項INSTANCE,就可以呼叫map()方法對映實體屬性到模型中去了。

    但是這是在實體與模型的屬性命名一致的情況下,這種情況下對映基本上不需要我們指定模型的哪個屬性對應實體的哪個屬性,在模型屬性命名與實體屬性命名不一致的情況下,還可以使用@Mapping(target = "模型屬性", source = "實體屬性")來指定的對映某個屬性

    重新定義PersonModel跟Person

    這裡定義實體Person

  1. publicclass Person {    
  2.     private String name;    
  3.     privateint age;    
  4.     private String phone;    
  5. }   

這裡定義模型PersonModel 
  1. publicclass PersonModel {    
  2.     private String personName;    
  3.     privateint age;    
  4.     private String phone;    
  5. }    

其中將PersonModel中的name屬性改為personName,這裡的對映介面寫法就可以寫成
  1. @Mapper
  2. publicinterface PersonMapper {  
  3.     PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);  
  4.     @Mapping(target = "personName", source = "name")  
  5.     PersonModel map( Person entity);  
  6.     List<PersonModel > map(List< Person> entity);  
  7. }  

如果model定義了在實體沒有可以對映的屬性時,就可以使用@Mapping(target = "模型屬性", ignore = true)來跳過不需要對映的模型屬性了。

    如下面重新定義實體Person和模型PersonModel

    這裡定義實體Person

  1. publicclass Person {    
  2.     private String name;    
  3.     privateint age;    
  4.     private String phone;    
  5. 相關推薦

    使用Mapstruct進行domain實體Entity模型之間對映操作,減少之間程式碼轉化

    轉載地址:http://blog.csdn.net/lu_ckid/article/details/54602057 在一個成熟可維護的工程中,細分模組後,domian工程最好不要被其他工程依賴,但是實體類一般存於domain之中,這樣其他工程想獲取實體類資

    Mapstruct針對domain實體Entity模型之間對映操作

    概述 MapStruct是一種型別安全的bean對映類生成java註釋處理器,是一種java物件轉換框架。 我們要做的就是定義一個對映器介面,宣告任何必需的對映方法。在編譯的過程中,MapStruct會生成此介面的實現。該實現使用純java方法呼叫的源和目標物件之間的對映,MapStruct

    js 通過全選操作進行批量刪除批量修改

    效果圖 1.先說js進行全選:  //展示這麼多,其實只需要看標紅部分就行 <form name="action" class="form-horizontal" role="form" method="post" enctype="multipart

    利用BufferStream進行圖片加密解密

    加密類: public static void JiaMi() { int a; try { BufferedInputStream input = new BufferedInputStream( new FileInputStream("C:\\Users\\Le

    機器學習之混合高斯模型(Gaussian Mixture Model)聚演算法+程式碼

    機器學習之混合高斯模型聚類演算法1 演算法原理2 演算法例項3 典型應用參考資料 機器學習分為監督學習、無監督學習和半監督學習(強化學習)。無監督學習最常應用的場景是聚類(clustering)和降維(dimension reduction)。聚類演算法包括:

    tensorflow 1.0 學習:用別人訓練好的模型進行圖像分類

    ima ppi gin 什麽 dir targe spl flow blog 谷歌在大型圖像數據庫ImageNet上訓練好了一個Inception-v3模型,這個模型我們可以直接用來進來圖像分類。 下載地址:https://storage.googleapis.com/d

    Vuejs 用$emit $on 進行兄弟元件之間的資料傳輸

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Vue2-單一事件管理元件通訊</title> &

    使用R進行缺失值分析處理

    一.分析 從統計上說,缺失的資料可能會產生有偏估計,從而使樣本資料不能很好地代表總體,而顯示中絕大部分資料都包含缺失值,因此如何處理缺失值很重要。 在R中,缺失值通常以NA標識,可以用is.na()和complete.case()可以判斷資料集是否完整。 is.na(

    tensorflow 1.0 學習:用Google訓練好的模型進行影象分類

    谷歌在大型影象資料庫ImageNet上訓練好了一個Inception-v3模型,這個模型我們可以直接用來進來影象分類。下載地址:github:https://github.com/taey16/tf/tree/master/imagenet下載完解壓後,得到幾個檔案:其中的c

    tensorflow 1.0 學習:用別人訓練好的模型進行影象分類

    谷歌在大型影象資料庫ImageNet上訓練好了一個Inception-v3模型,這個模型我們可以直接用來進來影象分類。 下載完解壓後,得到幾個檔案: 其中的classify_image_graph_def.pb 檔案就是訓練好的Inception-v3模型。 imagenet_synset_to_h

    Vuejs 用$emit$on進行資料傳輸通訊

    Vuejs 用$emit與$on來進行兄弟元件之間的資料傳輸通訊 <!DOCTYPE html> <html lang="en"> <head> <me

    tensorflow學習筆記十一:用別人訓練好的模型進行影象分類

    谷歌在大型影象資料庫ImageNet上訓練好了一個Inception-v3模型,這個模型我們可以直接用來進來影象分類。下載完解壓後,得到幾個檔案:其中的classify_image_graph_def.pb 檔案就是訓練好的Inception-v3模型。imagenet_sy

    利用Git Shell進行Github的遠端互動

               主要介紹利用git shell 來進行與github的遠端連結。 1. 利用git shell 從github clone repository (1).設定使用者資訊: 開啟git shell之後輸入以下兩行指令: git  config 

    EFcore動態模型

    partial 轉換 asp creating ace 模型 rac propertya builder   在開發商城系統的時候,大家會遇到這樣的需求,商城系統裏支持多種商品類型,比如衣服,手機,首飾等,每一種產品類型都有自己獨有的參數信息,比如衣服有顏色,首飾有材質等,

    別再把你當成打工者,而是把你自己當成一個公司,進行戰略規劃,逐步提升自己的價值

    部分 而是 打工 好的 mage 2.3 還需要 蘋果手機 知識 之前講了企業的平臺化趨勢,以及對個人的影響。很多讀者會覺得:我好像懂了,但轉頭就忘了,然後該幹嘛幹嘛了。如何真正落實到自己身上呢?答案是:別再把你當成打工者,而是把你自己當成一個公司,來進行戰略規

    Robot Framework獲取輸入後的文本/內容進行使用的方法

    發的 是不是 什麽 是什麽 class 百度 margin clas maxlength 如何在Robot Framework獲取剛剛在輸入框輸入的文本或內容呢?其它很簡單,但容易誤導人。 比如:<input id="kw" name="wd" class="s_ip

    CSS Display屬性模型

    鏈接 依據 使用 dem align ont 情況 rac rgb 由於HTML流式文檔的特性,頁面布局往往是新手最為頭疼的問題之中的一個。 每一個HTML元素都會渲染為一個Box,可分為inline Box和block Box。 依據display屬性的不同。Box

    (插播)關於使用jenkins + unity +Xcode 進行自己主動打包的處理。

    數據 net host shell腳本 unity3 fig 模式 是我 菜單 近期了解了下jenkins流程化服務的東西,個人感覺jenkins是一個非常方便的工具。主要是方便。設置好流程性得命令。僅僅需確定下就能夠達到自己主動化。減輕了錯誤得發生和簡化了帶來的復

    JavaSE7基礎 位運算 int型變量進行 按位 或非異或

    網上 深入 ava demo new 與或非 反碼 技術分享 notepad jdk版本 :jdk-7u72-windows-i586系統 :Windows7編輯器 :Notepad++ v7.4.2註意事項 :博文內容僅供參考,不可用於其他用途。 代

    案例:在表格中進行新增一行刪除一行

    ren 鏈接 默認 mage button 進行 cli ytd 超級鏈接 1.情況    2.思路   /*     * 為 #employeetable 的所有的 a 節點添加 Onclick 響應函數:     * 1. 彈出確認對話框: 確定要刪除 xx 的信息