这几天写的需求正在提测中,所以比较有空闲时间,正好来总结一下开发中遇到的问题并记录一下。
在开发过程中遇到这样一个问题:多个对象实体间要进行对象拷贝,并且对象里面还包含别的对象集合,对象名字也不同,但是里面的字段是一样的,使用普通的方式拷贝,发现只是进行了浅拷贝,里面的对象没有拷贝到。最后使用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
- <dependency>
- <groupId>org.mapstructgroupId>
- <artifactId>mapstructartifactId>
- dependency>
- <dependency>
- <groupId>org.mapstructgroupId>
- <artifactId>mapstruct-processorartifactId>
- dependency>
- //返给前端的对象
- public class UserVO {
- private Integer id;
- private String nickName;
- private Integer age;
-
- private List
dogs; - }
-
-
- public class DogVO {
- private String name;
- private String color;
- }
- //后端交互的对象
- public class User {
- private Integer id;
- private String name;
- private Integer age;
-
- private List
dogList; - }
-
-
- public class Dog {
- private String name;
- private String col;
- }
- 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);
-
- }
- public static void main(String[] args) {
- ArrayList
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());
- }
