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

首頁 > 開發(fā) > Java > 正文

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

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

摘要: 前面介紹了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()}

業(yè)務場景

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

分析與實現(xiàn)

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

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

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

@Mapperpublic 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);}

第三個需求有點變態(tài),但是真實發(fā)生在我們的項目中,實現(xiàn)起來確實繁瑣一些:

首先,自定義轉化邏輯,布爾值到字符串,布爾的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的自定義函數確實方便不少,不過與其他的轉換工具相比,上手難度確實大,配置也稍顯繁瑣。

項目代碼托管在碼云。

總結

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 襄汾县| 老河口市| 兴宁市| 绍兴县| 仪陇县| 延寿县| 灵山县| 思茅市| 泰州市| 康定县| 大姚县| 调兵山市| 长泰县| 从化市| 潮州市| 东乌珠穆沁旗| 乐亭县| 沂南县| 长丰县| 保康县| 凤城市| 贞丰县| 定南县| 冀州市| 普兰店市| 互助| 中超| 辰溪县| 西充县| 壤塘县| 永安市| 沁阳市| 江陵县| 洛川县| 雷波县| 宣威市| 凤冈县| 于田县| 新源县| 大关县| 正定县|