一款PO VO DTO 轉(zhuǎn)換神器,求求你別在到處找工具類了!
作者:bettermann
toutiao.com/i6891531055631696395/
老鐵們是不是經(jīng)常為寫一些實(shí)體轉(zhuǎn)換的原始代碼感到頭疼,尤其是實(shí)體字段特別多的時(shí)候。介紹一個(gè)開(kāi)源項(xiàng)目 mapstruct ,可以輕松優(yōu)雅的進(jìn)行轉(zhuǎn)換,簡(jiǎn)化你的代碼。當(dāng)然有的人喜歡寫get set,或者用BeanUtils 進(jìn)行復(fù)制,代碼只是工具,本文只是提供一種思路。
先貼下官網(wǎng)地址吧:https://mapstruct.org/
廢話不多說(shuō),上代碼:
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>
關(guān)于lombok和mapstruct的版本兼容問(wèn)題多說(shuō)幾句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外編譯的lombok mapstruct的插件不要忘了加上。否則會(huì)出現(xiàn)下面的錯(cuò)誤:No property named "aaa" exists in source parameter(s). Did you mean "null"?
這種異常就是lombok編譯異常導(dǎo)致缺少get setter方法造成的。還有就是缺少構(gòu)造函數(shù)也會(huì)拋異常。
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);}
實(shí)體類是開(kāi)發(fā)過(guò)程少不了的,就算是用工具生成肯定也是要有的,需要手寫的部分就是這個(gè)Mapper的接口,編譯完成后會(huì)自動(dòng)生成相應(yīng)的實(shí)現(xiàn)類
然后就可以直接用mapper進(jìn)行實(shí)體的轉(zhuǎn)換了
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);//這行代碼便是實(shí)際要用的代碼StudentVO studentVO = StudentMapper.INSTANCE.student2StudentVO(student);System.out.println(studentVO);}}
mapper可以進(jìn)行字段映射,改變字段類型,指定格式化的方式,包括一些日期的默認(rèn)處理。
可以手動(dòng)指定格式化的方法:
public interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);StudentVO student2StudentVO(Student student);default String getGenderName(GenderEnum gender) {return gender.getName();}}
上面只是最簡(jiǎn)單的實(shí)體映射處理,下面介紹一些高級(jí)用法
1.List 轉(zhuǎn)換
屬性映射基于上面的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.多對(duì)象轉(zhuǎn)換到一個(gè)對(duì)象
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("語(yǔ)文").build();StudentVO studentVO = StudentMapper.INSTANCE.studentAndCourse2StudentVO(student, course);System.out.println(studentVO);}}
3.默認(rèn)值
public interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);StudentVO studentAndCourse2StudentVO(Student student, Course course);}
更多精彩推薦
??外包程序員入職螞蟻金服被質(zhì)疑,網(wǎng)友:人生污點(diǎn)??前后端分離三連問(wèn):為何分離?如何分離?分離后的接口規(guī)范???如何設(shè)計(jì)一個(gè)通用的權(quán)限管理系統(tǒng)??去一家小公司從0到1搭建后端架構(gòu),做個(gè)總結(jié)!??這應(yīng)該是全網(wǎng)最全的Git分支開(kāi)發(fā)規(guī)范手冊(cè)~
最后,推薦給大家一個(gè)有趣有料的公眾號(hào):寫代碼的渣渣鵬,7年老程序員教你寫bug,回復(fù) 面試或資源 送一你整套開(kāi)發(fā)筆記 有驚喜哦




