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

          共 15000字,需瀏覽 30分鐘

           ·

          2021-09-29 03:26

          今日推薦
          借助Redis鎖,完美解決高并發(fā)秒殺問題
          還在直接用JWT做鑒權(quán)?JJWT真香
          Spring Boot 操作 Redis 的各種實現(xiàn)
          Fluent Mybatis 牛逼!
          Nginx 常用配置清單
          這玩意比ThreadLocal叼多了,嚇得我趕緊分享出來。


          來源:toutiao.com/i6891531055631696395

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

          當(dāng)然有的人喜歡寫get set,或者用BeanUtils 進行復(fù)制,代碼只是工具,本文只是提供一種思路。

          先貼下官網(wǎng)地址吧:https://mapstruct.org/

          廢話不多說,上代碼:

          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的版本兼容問題多說幾句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外編譯的lombok mapstruct的插件不要忘了加上。否則會出現(xiàn)下面的錯誤:No property named "aaa" exists in source parameter(s). Did you mean "null"?

          這種異常就是lombok編譯異常導(dǎo)致缺少get setter方法造成的。還有就是缺少構(gòu)造函數(shù)也會拋異常。學(xué)習(xí)資料:Java進階視頻資源

          @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);

          }

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

          然后就可以直接用mapper進行實體的轉(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);
                  //這行代碼便是實際要用的代碼
                  StudentVO studentVO = StudentMapper.INSTANCE.student2StudentVO(student);
                  System.out.println(studentVO);

              }

          }

          mapper可以進行字段映射,改變字段類型,指定格式化的方式,包括一些日期的默認(rèn)處理。

          可以手動指定格式化的方法:

          @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();
              }

          }

          上面只是最簡單的實體映射處理,下面介紹一些高級用法

          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.多對象轉(zhuǎn)換到一個對象

          @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("語文").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);

          }

          推薦文章


          1、一款高顏值的 SpringBoot+JPA 博客項目
          2、超優(yōu) Vue+Element+Spring 中后端解決方案
          3、推薦幾個支付項目!
          4、推薦一個 Java 企業(yè)信息化系統(tǒng)
          5、一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問答/社交網(wǎng)絡(luò)/博客)
          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  久久狠| 99精品视频免费观看 | 亚洲电影,操 | 国产三级精品在线 | 国产精品国产三级国芦专播精品人 |