亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MapStruct處理Java中實體與模型間不匹配屬性轉換的方法

發布時間:2020-09-28 02:59:29 來源:腳本之家 閱讀:657 作者:cj96248 欄目:編程語言

摘要: 前面介紹了MapStrut簡單用法,MapStrut的最重要的特點就是處理Java中實體與模型間不匹配屬性的轉換。

實體模型

有一個User對象:

public class User {
  private Integer id;
  private String name;
  private double account;
  private boolean married;
// setters, getters, toString()
}

有一個Employee 對象:

public class Employee {
  private int id;
  private String ename;
  private String position;
  private String married;
// setters, getters, toString()
}

業務場景

  • 需要User 與Employee 對象之間轉換。
  • User 的name屬性對應Employee 的ename屬性,其取值相同,類型相同,名稱不同
  • User 的married屬性(取值true和false)對應Employee 的married屬性(取值Y和N),其取值不同,類型不同,名稱相同。

分析與實現

最愚蠢的方式是自己寫一堆的setter方法與getter方法,大量get/set代碼堆積,增加了代碼長度和閱讀代碼的難度。利用工具BeanUtils是可以處理第一個需求的,但第三種需求就無能為力了。這時MapStrut就派上用場了,最簡單的配置可以像下面這樣:

@Mapper
public interface UserMapper {
  UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
  Employee userToEmployee(User user);
  User employeeToUser(Employee employee);
}

對于第二個需求,可以通過下面方式實現,注解@Mapping可以指定需要把哪個字段source轉換為哪個字段target

@Mapper
public interface UserMapper {
  UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
  @Mappings({
    @Mapping(source="name", target="ename")
  })
  Employee userToEmployee(User user);
  @Mappings({
    @Mapping(source="ename", target="name")
  })
  User employeeToUser(Employee employee);
}

第三個需求有點變態,但是真實發生在我們的項目中,實現起來確實繁瑣一些:

首先,自定義轉化邏輯,布爾值到字符串,布爾的true對應字符串的Y,布爾的false對應字符串的N:

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

使用很簡單,在接口的注解Mapper添加uses參數,值就是需要剛才的轉換邏輯類。

@Mapper(uses = UserTransform.class)
public interface UserMapper {...}

結果與分析

用Junit Test寫兩個測試方法,分別測試User 對象轉換Employee ,Employee 對象轉換User。

public class MidTest {
  @Test
  public void midTest(){
    User user = new User();
    user.setId(125);
    user.setName("Lee");
    user.setMarried(true);
    Employee e = UserMapper.INSTANCE.userToEmployee(user);
    System.out.println(e);
  }
  @Test
  public void midTest2(){
    Employee e = new Employee();
    e.setId(222);
    e.setEname("Chao");
    e.setMarried("N");
    User u = UserMapper.INSTANCE.employeeToUser(e);
    System.out.println(u);
  }
}

結果如下:

User [id=222, name=Chao, account=0.0, married=false]
Employee [id=125, ename=Lee, position=null, married=Y]

轉換結果符合預期,轉化期間不存在的屬性,有了默認值(account和position),包裝類也能識別(int和Integer),從自動生成的UserMapperImpl.java中,可以看到,

employee.setMarried( userTransform.booleanToString( user.isMarried() ) );,用到了剛才自定義的轉換邏輯。第三種需求是很少的,但是遇到了也是很難解決的,MapStruct的自定義函數確實方便不少,不過與其他的轉換工具相比,上手難度確實大,配置也稍顯繁瑣。

項目代碼托管在碼云。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清水县| 武宁县| 承德县| 莎车县| 邢台市| 柘城县| 延吉市| 营口市| 循化| 黔西县| 荔浦县| 孟州市| 宁陕县| 苏州市| 安宁市| 察哈| 青阳县| 互助| 通道| 浦江县| 卢氏县| 宁强县| 呼图壁县| 象山县| 吉林市| 抚松县| 应用必备| 镶黄旗| 武夷山市| 新民市| 凤庆县| 漳浦县| 延川县| 崇阳县| 游戏| 霍邱县| 留坝县| 方山县| 濮阳县| 房产| 凤阳县|