mapstruct能将对象自动转换。
一、简单转换
1、导入依赖
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<!-- jdk8以下就使用mapstruct -->
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
2、编写测试实体类
1、接收到的参数实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User implements Serializable {
private Integer id;
private String status;
private String address;
private Date birthday;
}
2、预转换的实体类1(属性相同)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User2 implements Serializable {
private Integer id;
private String status;
private String address;
private Date birthday;
}
3、预转换的实体类2(属性不相同,缺少字段)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User3 implements Serializable {
private Integer id;
private Date birthday;
}
3、编写转换接口
import org.mapstruct.Mapper;
@Mapper
public interface UserConvertBasic {
UserConvertBasic INSTANCE= Mappers.getMapper(UserConvertBasic.class);
/**
* 1、将User转换为User2
*/
User2 fromUserConvert(User user);
/**
* 将User转换为User3
*/
User3 fromUserConvert2(User user);
/**
*如果是要转换集合的话,直接将实体类换成集合即可
*/
List<User3> toConvertVOList(List<User> source);
}
4、测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class test {
/**
* 1、測試User转User2
*/
@Test
public void userConvertUser2(){
//构建User实例
User user=User.builder()
.id(1)
.status("开放")
.address("辽宁大连")
.birthday(new Date())
.build();
User2 user2= UserConvertBasic.INSTANCE.fromUserConvert(user);
User3 user3=UserConvertBasic.INSTANCE.fromUserConvert2(user);
System.out.println("从User转换的User2:"+user2);
System.out.println("从User转换的User3:"+user3);
}
}
二、不简单转换
2.1 字段类型不一致
1、含不同数据类型字段的两个实体类
接受参数的实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Student implements Serializable {
private String name;
private Integer age;
private String birthday;
}
目标实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class StudentCon implements Serializable {
private String name;
private Integer age;
//与实体类不一致
private Date birthday;
}
2、编写转换接口
import com.lg.dto.Student;
import com.lg.dto.StudentCon;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
@Mapper
public interface StudentConvertBasic {
StudentConvertBasic INSTANCE= Mappers.getMapper(StudentConvertBasic.class);
/**
* 将Student转换为StudentCon类型
* @param student
* @return 转换后的 StudentCon 对象
*/
@Mappings({
@Mapping(expression = "java(com.lg.format.DateFormat.getUtilDate(student.getBirthday()))",target = "birthday"),
})
//target是指将student中的birthday值转换为StudentCon 实体类中的birthday
StudentCon convertStu(Student student);
}
expression 中的表达式如下
public class DateFormat {
public static Date getUtilDate(String dateStr){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
System.out.println("异常了");
}
return null;
}
}
3、测试
@Test
public void stuConvert(){
Student student=Student.builder()
.name("kobe")
.age(24)
.birthday("2018-01-12 17:07:05")
.build();
//进行转换
System.out.println(student);
StudentCon studentCon = StudentConvertBasic.INSTANCE.convertStu(student);
System.out.println("转换后的student:"+studentCon);
System.out.println(studentCon.getBirthday());
}
2.2 字段名不一致
1、实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Student implements Serializable {
private String name;
private Integer age;
private String birthday;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class StudentCon implements Serializable {
private String stuName;
private Integer stuAge;
//与实体类不一致
private Date birthday;
}
2、转换接口
@Mapper
public interface StudentConvertBasic {
StudentConvertBasic INSTANCE= Mappers.getMapper(StudentConvertBasic.class);
/**
* 将Student转换为StudentCon类型
* @param student
* @return 转换后的 StudentCon 对象
*/
@Mappings({
@Mapping(expression = "java(com.lg.format.DateFormat.getUtilDate(student.getBirthday()))",target = "birthday"),
@Mapping(source = "name",target ="stuName"),
@Mapping(source = "age",target = "stuAge")
})
StudentCon convertStu(Student student);
}