MapStruct实体转换及List转换的方法讲解
开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个Mapper接口,MapStruct就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地址:http://mapstruct.org/
引入依赖
org.mapstruct mapstruct-jdk8 1.1.0.Final
需求
我们假设有学生student类需要转换成用户user类,将学生信息存入用户信息库
此时Student类内容如下:
publicclassStudent{
privateIntegerid;
privateStringname;
privateIntegerage;
privateStringsex;
//setters,getters,toString()方法此处省略不写,但是实际开发需要写的哦
}
此时User类内容如下:
publicclassUser{
privateIntegerid;
privateStringname;
privateIntegerage;
privateStringsex;
//setters,getters,toString()方法此处省略不写,但是实际开发需要写的哦
}
转换model
此时Student和User的属性名字都相同那么转换接口就是
importorg.mapstruct.Mapper;
@Mapper(componentModel="spring")
publicinterfaceUserMapping{
/**
*Student转化为User
*@paramStudent
*@return
*/
UserstudentToUser(Studentstudent);
}
程序运行前要先编译mvncleancompile,从而mapstruct框架生成UserMappingImpl实现类。
转换model属性不匹配
如果User和Student的属性名不对应例如:
此时Student类内容如下:
publicclassStudent{
privateIntegerid;
privateStringsname;
privateIntegerage;
privateStringsex;
//setters,getters,toString()方法此处省略不写,但是实际开发需要写的哦
}
此时User类内容如下:
publicclassUser{
privateIntegerid;
privateStringuname;
privateIntegerage;
privateStringsex;
//setters,getters,toString()方法此处省略不写,但是实际开发需要写的哦
}
那么转换接口为
importorg.mapstruct.Mapper;
importorg.mapstruct.Mapping;
importorg.mapstruct.Mappings;
@Mapper(componentModel="spring")
publicinterfaceUserMapping{
/**
*Student转化为User
*@paramStudent
*@return
*/
@Mappings({
@Mapping(target="uname",source="sname")
//多个属性不对应可以用","隔开编写多个@Mapping
//,@Mapping(target="uname",source="sname")
})
UserstudentToUser(Studentstudent);
}
转换model属性类型不匹配
比如说user类的sex字段类型改为boolean
此时User类内容如下:
publicclassUser{
privateIntegerid;
privateStringuname;
privateIntegerage;
privatebooleansex;
//setters,getters,toString()方法此处省略不写,但是实际开发需要写的哦
}
这个转换需求有点变态,所以需要我门自己写个转换类
publicclassUserTransform{
publicStringbooleanToString(booleanvalue){
if(value){
return"男";
}
return"女";
}
publicbooleanstrToBoolean(Stringstr){
if("男".equals(str)){
returntrue;
}
returnfalse;
}
}
那么转换接口为(使用UserTransform.class类)
importorg.mapstruct.Mapper;
importorg.mapstruct.Mapping;
importorg.mapstruct.Mappings;
@Mapper(componentModel="spring",uses=UserTransform.class)
publicinterfaceUserMapping{
/**
*Student转化为User
*@paramStudent
*@return
*/
@Mappings({
@Mapping(target="uname",source="sname")
//多个属性不对应可以用","隔开编写多个@Mapping
//,@Mapping(target="uname",source="sname")
})
UserstudentToUser(Studentstudent);
}
转换list
当user和student都是集合形式list时应当如下转换
转化List<>集合时必须有实体转化,因为在实现中,List转换是for循环调用实体转化的。所以当属性名不对应时,应该在实体转化进行@Mappings的属性名映射配置,然后list的转换也会继承这和属性的映射。
例如属性名相同
importorg.mapstruct.Mapper;
@Mapper(componentModel="spring")
publicinterfaceUserMapping{
/**
*Student转化为User
*@paramStudent
*@return
*/
UserstudentToUser(Studentstudent);
/**
*Students转化为Users
*@paramStudents
*@return
*/
ListstudentsToUsers(Liststudents);
属性名不同:
importorg.mapstruct.Mapper;
importorg.mapstruct.Mapping;
importorg.mapstruct.Mappings;
@Mapper(componentModel="spring")
publicinterfaceUserMapping{
/**
*Student转化为User
*@paramStudent
*@return
*/
@Mappings({
@Mapping(target="uname",source="sname")
//多个属性不对应可以用","隔开编写多个@Mapping
//,@Mapping(target="uname",source="sname")
})
UserstudentToUser(Studentstudent);
/**
*此时studentsToUsers的实现为循环调用studentToUser并继承了studentToUser的属性映射
*Students转化为Users
*@paramStudents
*@return
*/
ListstudentsToUsers(Liststudents);
}
展示自动生成的UserMappingImpl实现(此类为执行mvncleancompile后自动生成)
@Component
publicclassUserMappingImplimplementsUserMapping{
@Override
publicUserstudentToUser(studentstudent){
if(student==null){
returnnull;
}
Useruser=newUser();
User.setId(student.getId());
User.setName(student.getName());
//如果配置了属性映射则为
//User.setUname(student.getSname());
User.setSex(student.getSex());
User.setAge(student.getAge());
returnuser;
}
@Override
publicListstudentsToUsers(Liststudents){
if(students==null){
returnnull;
}
Listlist=newArrayList();
for(studentstudent:students){
list.add(studentToUser(student));
}
returnlist;
}
}
参考资料:https://www.nhooo.com/article/157763.htm
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。