MapStruct解綁DTO與DO的映射賦值

MapStruct是一個類型安全的映射插件,能把已定義的類,映射到另一個類。解耦了對象之間的依賴關係。

一、問題場景再現

一般我們寫業務時,都要處理DTO與DO的轉換。假設要添加一個Man數據,將客戶端傳入的DTO轉成DO,笨拙的做法是new一個DO將Man所有的屬性賦值一遍,然後再用MyBatis的DAO插入到數據庫。如下代碼所示:

public class Man {//Man 
   private String name;
   private String age;
   private String mobileNO;
}
public class InsertRequst{//Man DTO
   private String name;
   private String age;
   private String mobileNO;
   private String serialNO;
   private String SMSCode;
   ...//get set 方法省略
}
@RestController
public String insertMan(@RequestBody InsertRequst insertRequst)//客戶端傳入請求
{
   if(!checkSMS(insertRequst.getSMSCode())){
      return "驗證碼錯誤";
   }
   Man man=new Man(){//此處爲DTO到DO的轉換,其他地方需要處理Man實體,就會出現多處類似代碼
      name=insertRequst.name;
      age=insertRequst.age;
      mobileNO=insertRequst.mobileNO;
  }   
  ManMapper.insert(man);
  ...//其餘代碼省略
}

二、MapStruct主角上場

MapStruct只適用於java 8以上版本。可以對這兩個實體進行映射,需要定義一個映射器提供映射服務,這個映射器對應如下代碼的ManMapper
(需要注意的是:在映射時,需要調用映射對象的set方法,所以每個需要映射的字段都必須有set方法。)

@RestController
public String insertMan(@RequestBody InsertRequst insertRequst)
{
   Man man=ManMapper.INSTANCE.toMan(insertRequst);
  ...//其餘代碼省略
}

映射處理器(ManMapper 接口)

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)//這裏要寫上,忽略不匹配的屬性
public interface ManMapper {
    ManMapper INSTANCE = Mappers.getMapper( ManMapper.class );
    Man toMan(InsertRequst man);
    //還可以進行映射定義,假設Man的name字段是manName,如
    //@Mapping(source="name",target="manName")
    //Man toMan(InsertRequst man);
}

附上代碼,請到git上自行下載:
https://github.com/Luolanjiao/mapstruct-demo

三、小結

最後引用MapStruct官網上的一段話,概括一下MapStruct的特點:

Compared to dynamic mapping frameworks, MapStruct offers the following advantages:
相比於上文的動態映射框架,MapStruct有如下幾點優勢:
Fast execution by using plain method invocations instead of reflection
使用普通的方法調用快效執行而不是編寫反射
Compile-time type safety: Only objects and attributes mapping to each other can be mapped, no accidental mapping of an order entity into a customer DTO etc.
編譯時類型安全:只有匹配成功的對象屬性纔會被成功映射,不會出現訂單型實體映射到DTO
Clear error-reports at build time, if
有如下情況,運行期間會清晰報錯:
. mappings are incomplete (not all target properties are mapped)
映射未全(不是所有的目標屬性都能被映射到)
. mappings are incorrect (cannot find a proper mapping method or type conversion)
映射錯誤(找不到匹配的映射方法或類型)

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