国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

MapStruct實體轉換及List轉換的方法講解

2024-07-14 08:43:39
字體:
來源:轉載
供稿:網友

開發中,我們經常需要將PO轉DTO、DTO轉PO等一些實體間的轉換。比較出名的有BeanUtil 和ModelMapper等,它們使用簡單,但是在稍顯復雜的業務場景下力不從心。MapStruct這個插件可以用來處理domin實體類與model類的屬性映射,可配置性強。只需要定義一個 Mapper 接口,MapStruct 就會自動實現這個映射接口,避免了復雜繁瑣的映射實現。MapStruct官網地址: http://mapstruct.org/

引入依賴

    <dependency>      <groupId>org.mapstruct</groupId>      <artifactId>mapstruct-jdk8</artifactId>      <version>1.1.0.Final</version>    </dependency>

需求

我們假設有學生student 類 需要轉換成 用戶 user 類,將學生信息存入用戶信息庫

此時Student 類內容如下:

public class Student {  private Integer id;  private String name;  private Integer age;  private String sex;  //setters, getters, toString() 方法此處省略不寫,但是實際開發需要寫的哦   }

此時User 類內容如下:

public class User {  private Integer id;  private String name;  private Integer age;  private String sex;  //setters, getters, toString() 方法此處省略不寫,但是實際開發需要寫的哦  }

轉換model

此時 Student 和 User 的屬性名字都相同那么轉換接口就是

import org.mapstruct.Mapper;@Mapper(componentModel = "spring")public interface UserMapping {  /**   * Student 轉化為 User   * @param Student   * @return   */   User studentToUser(Student student);}

程序運行前要先編譯 mvn clean compile , 從而mapstruct框架生成UserMappingImpl 實現類。

轉換model 屬性不匹配

如果 User 和 Student 的屬性名不對應例如:

此時Student 類內容如下:

public class Student {  private Integer id;  private String sname;  private Integer age;  private String sex;  //setters, getters, toString() 方法此處省略不寫,但是實際開發需要寫的哦   }

此時User 類內容如下:

public class User {  private Integer id;  private String uname;  private Integer age;  private String sex;  //setters, getters, toString() 方法此處省略不寫,但是實際開發需要寫的哦  }

那么轉換接口為

import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.Mappings;@Mapper(componentModel = "spring")public interface UserMapping {  /**   * Student 轉化為 User   * @param Student   * @return   */   @Mappings({      @Mapping(target = "uname", source = "sname")     // 多個屬性不對應可以用 "," 隔開編寫多個@Mapping     // ,@Mapping(target = "uname", source = "sname")  })   User studentToUser(Student student);}

轉換model 屬性類型不匹配

比如說user 類的sex字段類型改為boolean

此時User 類內容如下:

public class User {  private Integer id;  private String uname;  private Integer age;  private boolean sex;  //setters, getters, toString() 方法此處省略不寫,但是實際開發需要寫的哦  }

這個轉換需求有點變態,所以 需要我門自己寫個轉換類

public class UserTransform {  public String booleanToString(boolean value){    if(value){      return "男";    }    return "女";  }  public boolean strToBoolean(String str){    if ("男".equals(str)) {      return true;    }    return false;  }}

那么轉換接口為(使用 UserTransform.class 類)

import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.Mappings;@Mapper(componentModel = "spring",uses = UserTransform.class)public interface UserMapping {  /**   * Student 轉化為 User   * @param Student   * @return   */   @Mappings({      @Mapping(target = "uname", source = "sname")     // 多個屬性不對應可以用 "," 隔開編寫多個@Mapping     // ,@Mapping(target = "uname", source = "sname")  })   User studentToUser(Student student);}

轉換list

當user 和 student 都是集合形式list 時應當如下轉換

轉化 List<> 集合時必須有 實體轉化,因為在實現中,List 轉換是 for循環調用 實體轉化的。所以當屬性名不對應時,應該在 實體轉化進行 @Mappings 的屬性名映射配置,然后list的轉換也會繼承這和屬性的映射。

例如 屬性名相同

import org.mapstruct.Mapper;@Mapper(componentModel = "spring")public interface UserMapping {  /**   * Student 轉化為 User   * @param Student   * @return   */   User studentToUser(Student student);   /**   * Students 轉化為 Users   * @param Students   * @return   */   List<User> studentsToUsers(List<Student> students);

屬性名不同:

import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.Mappings;@Mapper(componentModel = "spring")public interface UserMapping {  /**   * Student 轉化為 User   * @param Student   * @return   */   @Mappings({      @Mapping(target = "uname", source = "sname")     // 多個屬性不對應可以用 "," 隔開編寫多個@Mapping     // ,@Mapping(target = "uname", source = "sname")  })   User studentToUser(Student student);  /**   * 此時 studentsToUsers 的實現為循環調用 studentToUser 并繼承了 studentToUser 的屬性映射   * Students 轉化為 Users   * @param Students   * @return   */   List<User> studentsToUsers(List<Student> students);}

展示自動生成的 UserMappingImpl 實現(此類為 執行 mvn clean compile 后自動生成)

@Componentpublic class UserMappingImpl implements UserMapping {  @Override  public User studentToUser(student student) {    if ( student == null ) {      return null;    }    User user = new User();    User.setId(student.getId() );    User.setName(student.getName() );    // 如果配置了屬性映射則為    //User.setUname(student.getSname() );    User.setSex(student.getSex() );    User.setAge(student.getAge() );    return user;  }  @Override  public List<User> studentsToUsers(List<student> students) {    if ( students == null ) {      return null;    }    List<User> list = new ArrayList<User>();    for ( student student : students ) {      list.add( studentToUser( student ) );    }    return list;  }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新竹县| 蓝山县| 娄底市| 陵水| 喀喇| 建昌县| 东莞市| 绥滨县| 达尔| 龙江县| 云霄县| 呈贡县| 古浪县| 鹤岗市| 集贤县| 崇文区| 阿拉尔市| 林口县| 富锦市| 织金县| 新昌县| 多伦县| 长子县| 旬阳县| 泰和县| 潍坊市| 百色市| 天等县| 九龙坡区| 呼玛县| 枣阳市| 广水市| 加查县| 蒲城县| 永德县| 望江县| 岳普湖县| 井陉县| 壤塘县| 宁河县| 隆回县|