<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)換神器不香么?

          共 14716字,需瀏覽 30分鐘

           ·

          2021-09-23 00:16

          老鐵們是不是經(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-8</project.build.sourceEncoding>
                  <maven.compiler.source>1.8</maven.compiler.source>
                  <maven.compiler.target>1.8</maven.compiler.target>
                  <org.mapstruct.version>1.4.1.Final</org.mapstruct.version>
                  <org.projectlombok.version>1.18.12</org.projectlombok.version>
          </properties>

          <dependencies>
                  <dependency>
                      <groupId>org.mapstruct</groupId>
                      <artifactId>mapstruct</artifactId>
                      <version>${org.mapstruct.version}</version>
                  </dependency>

                  <!-- lombok dependencies should not end up on classpath -->
                  <dependency>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                      <version>${org.projectlombok.version}</version>
                      <scope>provided</scope>
                  </dependency>

                  <!-- idea 2018.1.1 之前的版本需要添加下面的配置,后期的版本就不需要了,可以注釋掉,
          我自己用的2019.3 -->

               <dependency>
                      <groupId>org.mapstruct</groupId>
                      <artifactId>mapstruct-processor</artifactId>
                      <version>${org.mapstruct.version}</version>
                      <scope>provided</scope>
                  </dependency>

          </dependencies>

          <build>
                  <plugins>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-compiler-plugin</artifactId>
                          <version>3.8.1</version>
                          <configuration>
                              <source>1.8</source>
                              <target>1.8</target>
                              <annotationProcessorPaths>
                                  <path>
                                      <groupId>org.projectlombok</groupId>
                                      <artifactId>lombok</artifactId>
                                      <version>${org.projectlombok.version}</version>
                                  </path>
                                  <path>
                                      <groupId>org.mapstruct</groupId>
                                      <artifactId>mapstruct-processor</artifactId>
                                      <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ì)拋異常。

          @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í)體類是開(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)指定格式化的方法:

          @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<StudentVO> students2StudentVOs(List<Student> 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<Student> list = new ArrayList<>();
              list.add(student);
              List<StudentVO> 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);

          }


          PS:如果覺(jué)得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。
          瀏覽 17
          點(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>
                  操B久久久 | 青青草视频免费观看 | 手机看片91 | 久久99蜜桃 | 勉费av|