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註解