<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          別再用 BeanUtils 了,這款 PO VO DTO 轉(zhuǎn)換神器不香么?

          共 6383字,需瀏覽 13分鐘

           ·

          2021-10-16 12:13



          來(lái)源:toutiao.com/i6891531055631696395

          老鐵們是不是經(jīng)常為寫(xiě)一些實(shí)體轉(zhuǎn)換的原始代碼感到頭疼,尤其是實(shí)體字段特別多的時(shí)候。介紹一個(gè)開(kāi)源項(xiàng)目 mapstruct ,可以輕松優(yōu)雅的進(jìn)行轉(zhuǎn)換,簡(jiǎn)化你的代碼。

          當(dāng)然有的人喜歡寫(xiě)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ì)拋異常。學(xué)習(xí)資料:Java進(jìn)階視頻資源

          @Data
          @Builder
          @AllArgsConstructor
          @NoArgsConstructor
          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;
          ????}
          }
          @Data
          @Builder
          @AllArgsConstructor
          @NoArgsConstructor
          public?class?StudentVO?{
          ????private?String?name;
          ????private?int?age;
          ????private?String?gender;
          ????private?Double?height;
          ????private?String?birthday;
          }
          @Mapper
          public?interface?StudentMapper?{

          ????StudentMapper?INSTANCE?=?Mappers.getMapper(StudentMapper.class);

          ????@Mapping(source?=?"gender.name",?target?=?"gender")
          ????@Mapping(source?=?"birthday",?target?=?"birthday",?dateFormat?=?"yyyy-MM-dd?HH:mm:ss")
          ????StudentVO?student2StudentVO(Student?student);

          }

          實(shí)體類(lèi)是開(kāi)發(fā)過(guò)程少不了的,就算是用工具生成肯定也是要有的,需要手寫(xiě)的部分就是這個(gè)Mapper的接口,編譯完成后會(huì)自動(dòng)生成相應(yīng)的實(shí)現(xiàn)類(lèi)

          然后就可以直接用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)行字段映射,改變字段類(lèi)型,指定格式化的方式,包括一些日期的默認(rèn)處理。

          可以手動(dòng)指定格式化的方法:

          @Mapper
          public?interface?StudentMapper?{

          ????StudentMapper?INSTANCE?=?Mappers.getMapper(StudentMapper.class);

          ????@Mapping(source?=?"gender",?target?=?"gender")
          ????@Mapping(source?=?"birthday",?target?=?"birthday",?dateFormat?=?"yyyy-MM-dd?HH:mm:ss")
          ????StudentVO?student2StudentVO(Student?student);

          ????default?String?getGenderName(GenderEnum?gender)?{
          ????????return?gender.getName();
          ????}

          }

          上面只是最簡(jiǎn)單的實(shí)體映射處理,下面介紹一些高級(jí)用法

          1.List 轉(zhuǎn)換

          屬性映射基于上面的mapping配置

          @Mapper
          public?interface?StudentMapper?{

          ????StudentMapper?INSTANCE?=?Mappers.getMapper(StudentMapper.class);

          ????@Mapping(source?=?"gender.name",?target?=?"gender")
          ????@Mapping(source?=?"birthday",?target?=?"birthday",?dateFormat?=?"yyyy-MM-dd?HH:mm:ss")
          ????StudentVO?student2StudentVO(Student?student);


          ????List?students2StudentVOs(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();

          ????List?list?=?new?ArrayList<>();
          ????list.add(student);
          ????List?result?=?StudentMapper.INSTANCE.students2StudentVOs(list);
          ????System.out.println(result);
          }

          2.多對(duì)象轉(zhuǎn)換到一個(gè)對(duì)象

          @Data
          @Builder
          @AllArgsConstructor
          @NoArgsConstructor
          public?class?Student?{

          ????private?String?name;
          ????private?int?age;
          ????private?GenderEnum?gender;
          ????private?Double?height;
          ????private?Date?birthday;

          }
          @Data
          @AllArgsConstructor
          @Builder
          @NoArgsConstructor
          public?class?Course?{

          ????private?String?courseName;
          ????private?int?sortNo;
          ????private?long?id;

          }
          @Data
          @Builder
          @AllArgsConstructor
          @NoArgsConstructor
          public?class?StudentVO?{
          ????private?String?name;
          ????private?int?age;
          ????private?String?gender;
          ????private?Double?height;
          ????private?String?birthday;
          ????private?String?course;
          }
          @Mapper
          public?interface?StudentMapper?{

          ????StudentMapper?INSTANCE?=?Mappers.getMapper(StudentMapper.class);

          ????@Mapping(source?=?"student.gender.name",?target?=?"gender")
          ????@Mapping(source?=?"student.birthday",?target?=?"birthday",?dateFormat?=?"yyyy-MM-dd?HH:mm:ss")
          ????@Mapping(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)值

          @Mapper
          public?interface?StudentMapper?{

          ????StudentMapper?INSTANCE?=?Mappers.getMapper(StudentMapper.class);

          ????@Mapping(source?=?"student.gender.name",?target?=?"gender")
          ????@Mapping(source?=?"student.birthday",?target?=?"birthday",?dateFormat?=?"yyyy-MM-dd?HH:mm:ss")
          ????@Mapping(source?=?"course.courseName",?target?=?"course")
          ????@Mapping(target?=?"name",?source?=?"student.name",?defaultValue?=?"張三")
          ????StudentVO?studentAndCourse2StudentVO(Student?student,?Course?course);

          }

          程序汪資料鏈接

          程序汪接的7個(gè)私活都在這里,經(jīng)驗(yàn)整理

          Java項(xiàng)目分享 ?最新整理全集,找項(xiàng)目不累啦 04版

          堪稱(chēng)神級(jí)的Spring Boot手冊(cè),從基礎(chǔ)入門(mén)到實(shí)戰(zhàn)進(jìn)階

          臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開(kāi)放下載!

          臥槽!阿里大佬總結(jié)的《圖解Java》火了,完整版PDF開(kāi)放下載!

          字節(jié)跳動(dòng)總結(jié)的設(shè)計(jì)模式 PDF 火了,完整版開(kāi)放下載!

          歡迎添加程序汪個(gè)人微信 itwang008? 進(jìn)粉絲群或圍觀朋友圈

          瀏覽 24
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲国产高清精品 | 插插插色欲 | 亚洲XX00 | 亚洲第一区视频 | 黑人无码精品黑人,黑人 |