这几天写的需求正在提测中,所以比较有空闲时间,正好来总结一下开发中遇到的问题并记录一下。
在开发过程中遇到这样一个问题:多个对象实体间要进行对象拷贝,并且对象里面还包含别的对象集合,对象名字也不同,但是里面的字段是一样的,使用普通的方式拷贝,发现只是进行了浅拷贝,里面的对象没有拷贝到。最后使用MapStruct方法完美解决,主要原因:拷贝速度快,支持深拷贝。
本文只教简单实现深拷贝,如果想学习更深的知识就去官网查看。。
MapStruct官网:https://mapstruct.org/
使用方法:
1.新建XXMapper,接口或抽象类 (比如:UserMapper)
2.加上注解 @Mapper (注意引入的import包:org.mapstruct.xxxx)
3.创建转换方法 (如下图代码方法userToUserVO(User user))
4.在方法上添加@Mapping(source="源对象:这里就是是User中的属性",target = "目标对象:这里就是UserVO的属性")
如下图,user.name 要转成 userVO.nikeName
5.若有多个属性不同,可用@Mappings
代码示例:
1、引入相关依赖:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
2、写几个要映射的对象:
//返给前端的对象
public class UserVO {
private Integer id;
private String nickName;
private Integer age;
private List<DogVO> dogs;
}
public class DogVO {
private String name;
private String color;
}
//后端交互的对象
public class User {
private Integer id;
private String name;
private Integer age;
private List<Dog> dogList;
}
public class Dog {
private String name;
private String col;
}
3、定义一个映射器:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* @author
* @description: 定义一个映射器
* @version: 1.0
*/
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
/**
* User的映射
*/
@Mappings({@Mapping(source = "dogList",target = "dogs"),@Mapping(source = "name",target = "nickName")})
UserVO userToUserVO(User user);
/**
* Dog的映射
*/
@Mapping(source = "col",target = "color")
DogVO dogToDogVO(Dog dog);
}
4、测试代码:
public static void main(String[] args) {
ArrayList<Dog> dogs = new ArrayList<>();
Dog dog = new Dog("小蓝","蓝色");
Dog dog1 = new Dog("小黑","黑色");
Dog dog2 = new Dog("小绿","绿色");
dogs.add(dog2);
dogs.add(dog1);
dogs.add(dog);
User user = new User();
user.setId(1);
user.setAge(18);
user.setName("Test");
user.setDogList(dogs);
UserVO userVO = UserMapper.INSTANCE.userToUserVO(user);
System.out.println(userVO.toString());
}