開發中,我們經常需要將po轉dto、dto轉po等一些實體間的轉換。比較出名的有beanutil 和modelmapper等,它們使用簡單,但是在稍顯復雜的業務場景下力不從心。mapstruct這個插件可以用來處理domin實體類與model類的屬性映射,可配置性強。只需要定義一個 mapper 接口,mapstruct 就會自動實現這個映射接口,避免了復雜繁瑣的映射實現。mapstruct官網地址:http://mapstruct.org/
引入依賴
1
2
3
4
5
|
<dependency> <groupid>org.mapstruct</groupid> <artifactid>mapstruct-jdk8</artifactid> <version> 1.1 . 0 . final </version> </dependency> |
需求
我們假設有學生student 類 需要轉換成 用戶 user 類,將學生信息存入用戶信息庫
此時student 類內容如下:
1
2
3
4
5
6
7
|
public class student { private integer id; private string name; private integer age; private string sex; //setters, getters, tostring() 方法此處省略不寫,但是實際開發需要寫的哦 } |
此時user 類內容如下:
1
2
3
4
5
6
7
|
public class user { private integer id; private string name; private integer age; private string sex; //setters, getters, tostring() 方法此處省略不寫,但是實際開發需要寫的哦 } |
轉換model
此時 student 和 user 的屬性名字都相同那么轉換接口就是
1
2
3
4
5
6
7
8
9
10
|
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 類內容如下:
1
2
3
4
5
6
7
|
public class student { private integer id; private string sname; private integer age; private string sex; //setters, getters, tostring() 方法此處省略不寫,但是實際開發需要寫的哦 } |
此時user 類內容如下:
1
2
3
4
5
6
7
|
public class user { private integer id; private string uname; private integer age; private string sex; //setters, getters, tostring() 方法此處省略不寫,但是實際開發需要寫的哦 } |
那么轉換接口為
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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 類內容如下:
1
2
3
4
5
6
7
|
public class user { private integer id; private string uname; private integer age; private boolean sex; //setters, getters, tostring() 方法此處省略不寫,但是實際開發需要寫的哦 } |
這個轉換需求有點變態,所以 需要我門自己寫個轉換類
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 "男" ; } return "女" ; } public boolean strtoboolean(string str){ if ( "男" .equals(str)) { return true ; } return false ; } } |
那么轉換接口為(使用 usertransform.class 類)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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的轉換也會繼承這和屬性的映射。
例如 屬性名相同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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); |
屬性名不同:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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 后自動生成)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
@component public 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; } } |
參考資料 :http://www.zmynmublwnt.cn/article/178072.html
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/u012373815/article/details/88367456