Live2d Test Env

MapStruct的简单使用

零.简介

  在JAVA开发中,返回对象vo一般与实体类对象entity属性不符,字段的数量,名称,类型都可能会有差异,但我们手动创建bean映射器非常耗时,MapStruct就是用来解决这个问题.

一.将MapStruct引入工程

<properties>                                                                      
    <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>    
    <org.mapstruct.version>1.3.0.Final</org.mapstruct.version>                    
    <org.mapstruct.processor.version>1.3.0.Final</org.mapstruct.processor.version>
</properties>

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

<configuration>                                         
    <source>${java.version}</source>                    
    <target>${java.version}</target>                    
    <annotationProcessorPaths>                          
        <path>                                          
            <groupId>org.projectlombok</groupId>        
            <artifactId>lombok</artifactId>             
            <version>${lombok.version}</version>        
        </path>                                         
        <path>                                          
            <groupId>org.mapstruct</groupId>            
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version> 
        </path>                                         
    </annotationProcessorPaths>                         
    <compilerArgs>                                      
        <compilerArg>                                   
            -Amapstruct.defaultComponentModel=spring    
        </compilerArg>                                  
    </compilerArgs>                                     
</configuration>

 

二.简单使用 

  0.数据准备

 1 /**
 2  * 学生实体类
 3  */
 4 @Data
 5 @AllArgsConstructor
 6 @NoArgsConstructor
 7 public class Student {
 8   private Long id;
 9   private String name;
10   private Integer age;
11 }
12 
13 /**
14  * 学生VO
15  */
16 @Data
17 @NoArgsConstructor
18 @AllArgsConstructor
19 public class StudentVo {
20   private Long id;
21   private String name;
22   private Integer age;
23   private String address;
24 }

  1.编写StudentConvert接口

1 @Mapper(componentModel = "spring")
2 public interface StudentConvert {
3   StudentConvert INSTANCE = Mappers.getMapper(StudentConvert.class);
4   StudentVo toConvertVo(Student student);
5 }

  2.在service中使用

1 public void List() {                                        
2   Student student = new Student(1L,"张三",23);                
3   StudentVo studentVo = studentConvert.toConvertVo(student);
4   System.out.println(studentVo);                            
5 }                                                           

  3.运行结果

StudentVo(id=1, name=张三, age=23, address=null)

  4.简单分析

  在代码编译时,mapstruct会和lombook合作,根据对象的字段名称逐一匹配,调用lombook产生的get/set方法,自动生成实现类为vo对象填充信息

 1 @Component
 2 public class StudentConvertImpl implements StudentConvert {
 3   public StudentConvertImpl() {
 4   }
 5 
 6   public StudentVo toConvertVo(Student student) {
 7     if (student == null) {
 8       return null;
 9     } else {
10       StudentVo studentVo = new StudentVo();
11       studentVo.setId(student.getId());
12       studentVo.setName(student.getName());
13       studentVo.setAge(student.getAge());
14       return studentVo;
15     }
16   }
17 }

三.常用的特殊转换

  0.数字类型互相自动转换

  数字间互相转换mapstruct使用的是强制类型转换,如果由大的数字类型转为小的数字类型可能会丢失精度

  1.数字类型和String自动转换

  数字转String用的是String类的valueof方法,是安全方法,String转数字用的是包装类的parse方法,可能会发生错误

  2.Date类型和String的类型转换

  Date和String可以自动互相转换,mapstruct自带了这个功能,但因为用户的时间字符串形式各异,所以时间自动转换使用范围很小,所以mapstruct单独在@mapping注解中提供了dateFromat的属性,非常的方便使用

1 @Mapping(source = "birthday",target = "birthday",dateFormat = "yyyy-MM-dd HH:mm:ss")
2 StudentVo toConvertVo(Student student);                                             

四.字段名称不同

  0.数据准备

 1 /**
 2  * 学生实体类
 3  */
 4 @Data
 5 @AllArgsConstructor
 6 @NoArgsConstructor
 7 public class Student {
 8   private Long id;
 9   private String name;
10   private Integer age;
11 }
12 /**
13  * 学生VO
14  */
15 @Data
16 @NoArgsConstructor
17 @AllArgsConstructor
18 public class StudentVo {
19   private Long studentId;
20   private String studentName;
21   private Integer age;
22   private String address;
23 }

  1.编写StudentConvert接口

  在转换的方法上加@Mapping注解,指定转换的字段.多个字段可以使用@Mappings,source是参数的字段名,target是返回值的字段名

1 @Mapper(componentModel = "spring")
2 public interface StudentConvert {
3   StudentConvert INSTANCE = Mappers.getMapper(StudentConvert.class);
4   
5   @Mappings({@Mapping(source = "id", target = "studentId"),
6       @Mapping(source = "name", target = "studentName")})
7   StudentVo toConvertVo(Student student);
8 }

  2.在service中使用

1 @Override                                                   
2 public void List() {                                        
3   Student student = new Student(1L,"张三",23);                
4   StudentVo studentVo = studentConvert.toConvertVo(student);
5   System.out.println(studentVo);                            
6 }                                                           

  3.运行结果

StudentVo(studentId=1, studentName=张三, age=23, address=null)

  4.mapstruct自动生成的代码

 1 public StudentVo toConvertVo(Student student) { 
 2   if (student == null) {                        
 3     return null;                                
 4   } else {                                      
 5     StudentVo studentVo = new StudentVo();      
 6     studentVo.setStudentId(student.getId());    
 7     studentVo.setStudentName(student.getName());
 8     studentVo.setAge(student.getAge());         
 9     return studentVo;                           
10   }                                             
11 }                                               
posted @ 2021-07-29 11:07  唯真不负  阅读(152)  评论(0)    收藏  举报