对象映射你用哪个

简介: 对象映射你用哪个

对象映射你用哪个?

对象映射是在业务开发DTO,VO,PO之间相互转化经常遇到的问题。刚入门的程序员把一个对象映射成其他对象往往会使用手动set,比如下面代码A映射到B,手动set会非常枯燥且麻烦,特别是当属性值非常多的时候。

class A {
   String f1,
   Long f2,
   .....
}
class B {
   String f1,
   Long f2,
   .....
}
public void mapAtoB(A a, B b) {
  B.f1 = A.f1;
  B.f2 = A.f2;
  .....
}

对象映射的三种方式

最近接手了一个其他组的项目,发现在项目中对象映射上竟然采用了三种不同方法:BeanUtil, Orika和MapStruct。BeanUtil是Spring框架自带的映射工具, Orika和Mapstruct是开源的对象映射的两种方法。下面的代码分别使用不同的方式进行对象映射

//BeanUtil
BeanUtils.copyProperties(a, b)
//Orika
private static final MapperFacade FACADE = new DefaultMapperFactory.Builder().build().getMapperFacade();
 b = FACADE.map(a, B.class);
//MapStruct
public interface Converter {
    Converter INSTANCE = Mappers.getMapper(Converter.class);
    B b = convertToEntity(A a);

对比

如果只是对比代码量,BeanUils的方式是最简单的,代码量最少,但是在实际的工作场景中会发现使用BeanUils是最坑的,比如传了Null的对象进去,就会报NPE的错误,需要在映射前进行判空的处理。下面是对三种方式的比较。

BeanUtils

优点

  1. 易于使用和配置。
  2. 不需要进行手动配置。
  3. 支持复制对象的属性。

缺点

  1. 映射速度较慢,因为它使用反射来获取和设置属性。
  2. 在处理复杂映射场景时可能会出现问题。
  3. 不支持自定义转换器和过滤器。

Orika

优点

  1. 映射速度非常快,因为它使用字节码生成来创建映射器。
  2. 支持复杂的映射场景,例如嵌套对象和集合映射。
  3. 可以通过自定义转换器和过滤器来进行高度个性化的映射。
  4. 易于使用和配置。

缺点

  1. Orika的字节码生成可能会导致应用程序的启动时间变慢。
  2. 需要在运行时生成字节码,这可能会影响应用程序的性能。
  3. 需要对映射器进行手动配置。

MapStruct

优点

  1. 映射速度非常快,因为它使用编译时生成的代码。
  2. 支持复杂的映射场景,例如嵌套对象和集合映射。
  3. 可以通过自定义转换器和过滤器来进行高度个性化的映射。
  4. 易于使用和配置。

缺点

  1. MapStruct的编译时代码生成可能会导致编译时间变长。
  2. 需要对映射器进行手动配置。

当选择这些工具中的一个时,应该考虑应用程序的特定需求。如果应用程序需要高性能和复杂的映射场景,则可以选择Orika或MapStruct。如果应用程序需要简单的属性复制,则可以选择BeanUtils。在Orika和MapStruct之间进行选择时,应该考虑是否更关注应用程序的启动时间还是编译时间。

代码可读性

从代码可读性和重构的角度来看,个人认为MapStruct是最佳选择。

MapStruct的代码生成是在编译时完成的,这意味着它生成的代码可以与手动编写的代码一样清晰和易于理解。此外,MapStruct生成的代码易于重构和维护,因为它们与手动编写的代码没有区别。

相比之下,Orika和BeanUtils生成的代码通常比手写的代码难以阅读和理解,这可能会导致在重构和维护代码时出现问题。Orika的字节码生成也可能会使代码变得更加复杂和难以调试。

因此,从代码可读性和重构的角度来看,MapStruct是最佳选择。它生成的代码清晰易懂,易于维护和重构。

相关文章
|
6月前
|
存储 Java
map中存储的是引用,而不是对象本身
该内容是关于Java编程中验证Map存储引用而非复制对象的示例。创建大型List导致内存增加,说明List确实占用空间。通过Person类示例,将不同对象放入Map,改变一个对象的属性后,比较原对象与Map中的键值对,发现两者相等,证明Map保存的是对象引用。
97 5
|
自然语言处理
如何定义标签词映射
如何定义标签词映射
|
3月前
|
Java 数据库连接 数据库
|
XML 存储 Java
Hibernate框架【三】——基本映射——一对一映射
Hibernate框架【三】——基本映射——一对一映射
80 0
|
存储 JavaScript Java
我学会了,封装自己得专属映射Map
映射是高层的数据结构,高层的数据结构还有栈和队列,这种数据结构更像是定义好了这种数据结构的相应的使用接口。 有了这些使用的接口包括这些数据结构本身所维持的一些性质,就可以非常容易的把它们放入一些具体的应用中,但是底层实现可以是多种多样的。 比如栈和队列的底层实现即可以是动态数组也可以是链表,映射 Map 也是类似这样的数据结构。
114 0
我学会了,封装自己得专属映射Map
获取一个集合中(集合中存贮的是对象)根据对象的某一个属性获取对应数据
获取一个集合中(集合中存贮的是对象)根据对象的某一个属性获取对应数据
109 0
直接取配置文件对应数据映射到对象中,可在代码中直接使用
直接取配置文件对应数据映射到对象中,可在代码中直接使用
|
数据库 C#
Entity Framewor简单属性映射
Entity Framewor简单属性映射
101 0
Entity Framewor简单属性映射
|
存储 JavaScript 前端开发
访问对象的属性,你知道有哪些方法?
相信对象对于每个使用JavaScript的人来说都不陌生。访问对象的属性几乎日常开发每天都在用。下面我们一起探索下有哪些方式可以实现属性的访问。
194 0
|
前端开发 JavaScript Java
WebJars 映射
WebJars 映射
194 0