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. 相關推薦

    no