国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 唐山市| 渝北区| 嘉禾县| 格尔木市| 海口市| 西安市| 九寨沟县| 洛宁县| 河曲县| 修文县| 兴隆县| 清丰县| 伊吾县| 永泰县| 兴文县| 布拖县| 大理市| 宁强县| 房山区| 兴仁县| 闸北区| 红桥区| 盐池县| 二连浩特市| 监利县| 通榆县| 石台县| 肇源县| 台北县| 衢州市| 建宁县| 灵山县| 甘谷县| 通渭县| 瑞丽市| 克山县| 华蓥市| 岳普湖县| 湖南省| 石林| 桂平市|