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(List students);
属性名不同:
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(List students); }
展示自动生成的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(List students){ if(students==null){ returnnull; } List list=newArrayList (); for(studentstudent:students){ list.add(studentToUser(student)); } returnlist; } }
参考资料:https://www.nhooo.com/article/157763.htm
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。