开发中,我们经常需要将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.zzvips.com/article/178072.html
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/u012373815/article/details/88367456