MapStruct

1.什麼是MapStructjava

  

  簡單來講,MapStruct 能夠將某幾種類型的對象映射爲另一種類型,如將多個 DO(業務實體對象) 對象轉換爲 DTO(數據傳輸對象),避免了在業務代碼內new  DTO對象和不斷的進行set方法 spring

2.如何使用MapStructapp

  (1)引入Maven依賴ide

    

   <!--mapStruct依賴-->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.2.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <scope>provided</scope>
            <version>1.2.0.Final</version>
        </dependency>

  (2)使用spa

    此處假設將兩個實體對象(StudentInfo,classInfo)轉換爲一個DTO(StudentInfoDTO)code

    

@Data
public class StudentInfo {
    /**
     * 姓名
     */
    private String siName;
    /**
     * 年齡
     */
    private Integer siAge;
    /**
     * 所屬班級
     */
    private String siClassId;
}
@Data
public class classInfo {
    /**
     * 名稱
     */
    private String ciName;
    /**
     * 別名
     */
    private String ciNickName;
    /**
     * 樓號
     */
    private String ciFloor;
}
@Data
public class StudentInfoDTO {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年齡
     */
    private Integer age;
    /**
     * 班級名稱
     */
    private String className;
}

    建立 Mapper(映射)接口,MapStruct 就會自動實現該接口component

    

@Mapper
public interface StudentInfoStruct {
    /**
     * get new mapStruct instance
     */
    StudentInfoStruct INSTANCE = Mappers.getMapper(StudentInfoStruct.class);

    /**
     * 轉換學生信息實體
     *
     * @return
     */
    @Mappings({
            @Mapping(source = "studentInfo.siName", target = "name"),
            @Mapping(source = "studentInfo.siAge", target = "age"),
            @Mapping(source = "classInfo.ciName", target = "className"),
    })
    StudentInfoDTO from(ClassInfo classInfo,StudentInfo studentInfo) ;
}

  業務層調用代碼orm

    classInfo,studentInfo實體  以經過邏輯實現得到對象

 StudentInfoDTO studentInfoDTO = StudentInfoStruct.INSTANCE.from(classInfo,studentInfo);

  單個實體對象轉換DTO同理blog

  (3)當轉換過程當中有邏輯實現時,如進行餘額變更或傳入單個參數過多,則須要定義的轉換 抽象類

  

@Mapper
public abstract class UserBalanceRecordStruct {
    /**
     * get new mapStruct instance
     */
    public static UserBalanceRecordStruct INSTANCE = Mappers.getMapper(UserBalanceRecordStruct.class);

    /**
     * 轉換餘額變更記錄
     *
     * @param balanceId     餘額帳戶編號
     * @param changeBalance 本次餘額變更金額
     * @param changeTypeId  變更類型
     * @param oldBalance    變更以前餘額
     * @param unifiedOrderNo 統一訂單編號
     * @return
     */
    public BalanceRecordEntity from(String balanceId, BigDecimal changeBalance, String changeTypeId, BigDecimal oldBalance, String mark, String unifiedOrderNo) {
        BalanceRecordEntity recordEntity = new BalanceRecordEntity();
        recordEntity.setUbrBalanceId(balanceId);
        recordEntity.setUbrChangeCount(changeBalance);
        recordEntity.setUbrTypeId(changeTypeId);
        recordEntity.setUbrChangeBefore(oldBalance);
        recordEntity.setUbrChangeAfter(oldBalance.add(changeBalance));
        recordEntity.setUbrMark(mark);
        recordEntity.setUbrUnifiedNo(unifiedOrderNo);
        return recordEntity;
    }

    /**
     * 經過原始的記錄請求參數實體轉換爲最新的分頁查詢記錄的請求參數實體
     *
     * @param param 帳戶變更記錄查詢實體
     * @return
     */
   // public abstract BalanceRecordSearchParam from(BalanceRecordListParam param,String logicId);
}

3.MapStruct註解

  • @Mapper:註解在接口、類上,這樣 MapStruct 纔會去實現該接口
    • componentModel:該屬性用於指定實現類的類型,有幾個屬性:
      • default:默認,不使用任何組建類型,能夠經過Mappers.getMapper(Class) 方式獲取實例對象
      • spring:在實現類上註解 @Component,可經過 @Autowired 方式注入
      • jsr330:實現類上添加@javax.inject.Named 和@Singleton註解,能夠經過 @Inject註解獲取。
  • @Mappings:配置多個@Mapping   單個實體轉換時,如字段一致,則不須要配置
  • @Mapping:配置屬性映射,若源對象屬性與目標對象名字一致,會自動映射對應屬性
    • source:源屬性、target:目標屬性
    • dateFormat:可將 String 到 Date 日期之間相互轉換,經過 SimpleDateFormat,該值爲 SimpleDateFormat 的日期格式

官網地址:http://mapstruct.org/

相關文章
相關標籤/搜索