Mapping Dozer vs MapStruct

POSTED BY MARIUSZ WYSZOMIERSKI

In multi-tier applications there is often a need for mapping between two data models. In this article you can read about comparing two mapping libraries:

  • Dozer ( http://dozer.sourceforge.net/ ) – popular library, where mapping is configured by XML files
  • MapStruct ( http://mapstruct.org/ ) – library, which is used for example in JHipster generator
  • The most common use case is coping data from entity objects to DTO objects usually used in service REST/SOAP.

    dozer 是一种JavaBean的映射工具,类似于Apache的BeanUtils。它可以灵活地处理复杂类型之间的映射。不但可以进行简单的属性映射、复杂的类型映射、双向映射、递归映射等,并且可以通过XML配置文件进行灵活的配置。 解决了vo dto entity 的转换 和时间转换问题 BeanUtils.copyProperties 是大家代码里最常出现的工具类,但只要你不把它用错成 Apache 包下的,而是使用 Spring 提供的,就基本还不会对性能造成多大影响。 但如果说性能更好,可替代手动get、set的,还是 MapStruct 更好用,因为它本身就是在编译期生成get、set代码,和我们写get、set一样。 其他一些组件包主要基于 AOP、ASM、CGlib,的技术手段实现的,所以也会有相应的性能损耗 MapStruct 是满足JSR269规范的一个Java注解处理器,用于为Java Bean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。 您所要做的就是定义一个mapper接口(@Mapper),该接口用于声明所有必须的映射方法。在编译期间 MapStruct 会为该接口自动生成实现类。该实现类使用简单的Java方法调用来映射source-target对象,在此过程中没有反射或类似的行为发生。 对于分布式系统,需要在不同系统之间传递与转换域对象。因为我们不希望外部公开内部域对象,也不允许外部域对象渗入系统。传统上,数据对象之间的映射通过手工编码(getter/setter)的方式实现,或对象组装器(或转换器)来解决。我们可能会开发某种自定义映射框架来满足我们的映射转换需求,但这一切都显得不够灵巧。 Dozer Dozer 是 Java Bean 到 Java Bean 映射器,它以... 随着软件架构分层越来越多,那么各个层次之间的数据模型就要面临着相互转换的问题,典型的就是我们可以在代码中见到各种O,如DO、DTO、VO等。 如在数据存储层,我们使用DO来抽象一个业务实体;在业务逻辑层,我们使用DTO来表示数据传输对象;到了展示层,我们又把对象封装成VO来与前端进行交互。 先来看一张图 想必大家伙原来都写过类似格式的代码,额···看着就不说了,冗长而繁琐,于是 MapStruct 这一类框架应运而生 包括: Spring BeanUtils Cglib package com.nebula.module.organization.utils. dozer ; import com.google.common.collect.Lists; import org. dozer . Dozer BeanMapper; import java.util.ArrayList; import java.util.Collection; import java.util.List; * Function:DTO/VO/DO等之间的转换 * Date: 2018/9 为哈么,你的代码也就仅仅是能用而已? 没有技术深度、短缺知识储备、匮乏经验积累的前提下,怎么写代码?百度呀,遇到问题这搜一点,那查一块,不管它是什么原理还是适合哪种场景,先粘贴到自己的工程里,看,能跑了,能跑就行。那这样的代码也就仅仅是能用程度的交付,根本没有一定的质量保证,也更别提数据结构、算法逻辑和设计模式了,那看的编程资料刷的LeetCode,全歇菜了。 当你感觉看了很多资料又不会用的时候,会说什么,真卷,都学到这样了。但其实我并不觉对技术的深度挖掘、梳理全套的知识体系,一点点耕耘一点点收 在 Dozer 中,我们能够在字段映射期间提示提示中的接口 . 我们如何在 MapStruct 中实现相同的目标?我无法在这里输入确切的代码 . 但是,它与下面类似 . 我们这里有一个Domain类示例:Class A extends C{...};其中,B是抽象类 . C是一个包含我们必须映射的List项的类 .类似的是DTO端的类和接口的结构 . 因此, Dozer 中的映射如下:Domain.ADTO... 1. 介绍创建由多个层组成的大型 Java 应用程序需要使用多种领域模型,如持久化模型、领域模型或者所谓的 DTO。为不同的应用程序层使用多个模型将要求我们提供 bean 之间的映射方法。手动执行此操作可以快速创建大量样板代码并消耗大量时间。幸运的是,Java 有多个对象映射框架。在本教程中,我们将 比较 最流行的 Java 映射框架的性能。综合日常使用情况和相关测试数据,个人感觉 MapStruct ... 为哈么,你的代码也就仅仅是能用而已? 没有技术深度、短缺知识储备、匮乏经验积累的前提下,怎么写代码?百度呀,遇到问题这搜一点,那查一块,不管它是什么原理还是适合哪种场景,先粘贴到自己的工程里,看,能跑了,能跑就行。那这样的代码也就仅仅是能用程度的交付,根本没有一定的质量保证,也 我有一个自定义转换器的推土机映射:com.xyz.Customercom.xyz.CustomerDAOcustomerNamecustomerName和转换器:public class Dozer EmptyString2NullConverter extends Dozer Converter {public Dozer EmptyString2NullConverter() {super(Stri... VO (view object/value object)表示层对象 1、前端展示的数据,在接口数据返回给前端的时候需要转成VO 2、个人理解使用场景,接口层服务中,将DTO转成VO,返回给前台 B0(bussines object)业务层对象 1、主要在服务内部使用的业务对象 2、可以包含多个对象,可以用于对象的聚合操作 3、个人理解使用场景,在服务层服务中,由DTO转成BO然后进行业务处理后,转成DTO返回到接口层 PO(persistent object)持久对象 1、出现位置为数据库数据,用来存储数