摘要: 前面介紹了mapstrut簡單用法,mapstrut的最重要的特點就是處理java中實體與模型間不匹配屬性的轉換。
實體模型
有一個user對象:
1
2
3
4
5
6
7
|
public class user { private integer id; private string name; private double account; private boolean married; // setters, getters, tostring() } |
有一個employee 對象:
1
2
3
4
5
6
7
|
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就派上用場了,最簡單的配置可以像下面這樣:
1
2
3
4
5
6
|
@mapper public interface usermapper { usermapper instance = mappers.getmapper(usermapper. class ); employee usertoemployee(user user); user employeetouser(employee employee); } |
對于第二個需求,可以通過下面方式實現,注解@mapping
可以指定需要把哪個字段source
轉換為哪個字段target
。
1
2
3
4
5
6
7
8
9
10
11
12
|
@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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
參數,值就是需要剛才的轉換邏輯類。
1
2
|
@mapper (uses = usertransform. class ) public interface usermapper {...} |
結果與分析
用junit test寫兩個測試方法,分別測試user 對象轉換employee ,employee 對象轉換user。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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的自定義函數確實方便不少,不過與其他的轉換工具相比,上手難度確實大,配置也稍顯繁瑣。
項目代碼托管在碼云。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/jiangchao858/article/details/77604469