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 }

浙公网安备 33010602011771号