一、常见问题
1、类型不一致
@Data public class TestMapperStruct{ private Integer age; }
@Data public class TestMapperStructDto { private String age; }
执行结果:
2、浅拷贝
-
浅拷贝是创建一个新对象,这个对象的属性值与原始对象相同,但对于引用类型的属性,仍然共享相同的引用。浅拷贝只复制对象及其引用,而不复制引用指向的对象本身。
-
深拷贝是创建一个新对象,这个对象的属性值与原始对象相同,包括引用类型的属性。深拷贝会递归复制引用对象,创建全新的对象,以确保拷贝后的对象与原始对象完全独立。
@Data public class Test { private String locationCode; private Test1 test1; }
@Data public class Test1 { private String locationCode; private String locationName; } 测试用例:
执行结果:
3、属性名不一致
@Data public class TestMapperStruct{ private String age1; }
@Data public class TestMapperStructDto { private String age; }
测试用例:
执行结果:
4、null值覆盖
@Data public class TestMapperStruct{ private String age; }
@Data public class TestMapperStructDto { private String age; }
测试用例:
执行结果:
5、boolean类型加+is属性开头的坑
@Data public class TestMapperStruct{ private Boolean isDeleted; }
@Data public class TestMapperStructDto { private boolean isDeleted; }
测试用例:
按理说Boolean 和boolean是拆装箱的关系应该可以赋值上
执行结果:
下面把is去掉
@Data public class TestMapperStruct{ private Boolean deleted; }
@Data public class TestMapperStructDto { private boolean deleted; }
测试用例
执行结果:
这回执行正确了
ps:如果两个实体类都是Boolean+is开头执行结果也会是正确的
执行结果:
6、不同内部类属性值相同赋值失败
@Data public class TestMapperStruct{ private User user; @Data public static class User{ private String name; private Integer age; } }
@Data public class TestMapperStructDto { private User user; @Data public static class User{ private String name; private Integer age; } }
测试用例:
执行结果:
如果换成hutool的BeanUtil.copyProperties就可以成功,上代码
执行结果:
7、没有赋值set、get方法
@Data public class TestMapperStruct{ private String locationCode; }
@Getter @ToString public class TestMapperStructDto { private String locationCode; }
测试用例:
执行结果:
8、性能问题
执行时间:
改成set方式
执行时间:
所以
BeanUtils.copyProperties性能比较低
二、推荐使用mapstruct
引入pom
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.3.Final</version> </dependency>
1、demo
测试代码
处理时间:
建议实体类转换用mapstruct不仅速度快而且提供了丰富的api
BeanUtils用反射,是在运行阶段相对来说比get、set方法慢、MapStruct在编译阶段生产get、set方法,就跟我们自己写get、set一样,基本不消耗性能;