一款PO VO DTO 转换神器,求求你别在到处找工具类了!
作者:bettermann
toutiao.com/i6891531055631696395/
老铁们是不是经常为写一些实体转换的原始代码感到头疼,尤其是实体字段特别多的时候。介绍一个开源项目 mapstruct ,可以轻松优雅的进行转换,简化你的代码。当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思路。
先贴下官网地址吧:https://mapstruct.org/
废话不多说,上代码:
pom 配置:
<properties><project.build.sourceEncoding>UTF-8project.build.sourceEncoding><maven.compiler.source>1.8maven.compiler.source><maven.compiler.target>1.8maven.compiler.target><org.mapstruct.version>1.4.1.Finalorg.mapstruct.version><org.projectlombok.version>1.18.12org.projectlombok.version>properties><dependencies><dependency><groupId>org.mapstructgroupId><artifactId>mapstructartifactId><version>${org.mapstruct.version}version>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>${org.projectlombok.version}version><scope>providedscope>dependency><dependency><groupId>org.mapstructgroupId><artifactId>mapstruct-processorartifactId><version>${org.mapstruct.version}version><scope>providedscope>dependency>dependencies><build><plugins><plugin><groupId>org.apache.maven.pluginsgroupId><artifactId>maven-compiler-pluginartifactId><version>3.8.1version><configuration><source>1.8source><target>1.8target><annotationProcessorPaths><path><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>${org.projectlombok.version}version>path><path><groupId>org.mapstructgroupId><artifactId>mapstruct-processorartifactId><version>${org.mapstruct.version}version>path>annotationProcessorPaths>configuration>plugin>plugins>build>
关于lombok和mapstruct的版本兼容问题多说几句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外编译的lombok mapstruct的插件不要忘了加上。否则会出现下面的错误:No property named "aaa" exists in source parameter(s). Did you mean "null"?
这种异常就是lombok编译异常导致缺少get setter方法造成的。还有就是缺少构造函数也会抛异常。
public class Student {private String name;private int age;private GenderEnum gender;private Double height;private Date birthday;}public enum GenderEnum {Male("1", "男"),Female("0", "女");private String code;private String name;public String getCode() {return this.code;}public String getName() {return this.name;}GenderEnum(String code, String name) {this.code = code;this.name = name;}}public class StudentVO {private String name;private int age;private String gender;private Double height;private String birthday;}public interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);StudentVO student2StudentVO(Student student);}
实体类是开发过程少不了的,就算是用工具生成肯定也是要有的,需要手写的部分就是这个Mapper的接口,编译完成后会自动生成相应的实现类
然后就可以直接用mapper进行实体的转换了
public class Test {public static void main(String[] args) {Student student = Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();System.out.println(student);//这行代码便是实际要用的代码StudentVO studentVO = StudentMapper.INSTANCE.student2StudentVO(student);System.out.println(studentVO);}}
mapper可以进行字段映射,改变字段类型,指定格式化的方式,包括一些日期的默认处理。
可以手动指定格式化的方法:
public interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);StudentVO student2StudentVO(Student student);default String getGenderName(GenderEnum gender) {return gender.getName();}}
上面只是最简单的实体映射处理,下面介绍一些高级用法
1.List 转换
属性映射基于上面的mapping配置
public interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);(source = "gender.name", target = "gender")(source = "birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss")StudentVO student2StudentVO(Student student);Liststudents2StudentVOs(List ;studentList) }public static void main(String[] args) {Student student = Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();Listlist = new ArrayList<>(); list.add(student);Listresult = StudentMapper.INSTANCE.students2StudentVOs(list); System.out.println(result);}
2.多对象转换到一个对象
public class Student {private String name;private int age;private GenderEnum gender;private Double height;private Date birthday;}public class Course {private String courseName;private int sortNo;private long id;}public class StudentVO {private String name;private int age;private String gender;private Double height;private String birthday;private String course;}public interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);(source = "student.gender.name", target = "gender")(source = "student.birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss")(source = "course.courseName", target = "course")StudentVO studentAndCourse2StudentVO(Student student, Course course);}public class Test {public static void main(String[] args) {Student student = Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();Course course = Course.builder().id(1L).courseName("语文").build();StudentVO studentVO = StudentMapper.INSTANCE.studentAndCourse2StudentVO(student, course);System.out.println(studentVO);}}
3.默认值
public interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);StudentVO studentAndCourse2StudentVO(Student student, Course course);}
更多精彩推荐
☞ 外包程序员入职蚂蚁金服被质疑,网友:人生污点☞ 前后端分离三连问:为何分离?如何分离?分离后的接口规范?☞ 如何设计一个通用的权限管理系统☞ 去一家小公司从0到1搭建后端架构,做个总结!☞ 这应该是全网最全的Git分支开发规范手册~
最后,推荐给大家一个有趣有料的公众号:写代码的渣渣鹏,7年老程序员教你写bug,回复 面试或资源 送一你整套开发笔记 有惊喜哦
评论




