Java基础学习:Dozer映射框架

2024-05-07 21:12

本文主要是介绍Java基础学习:Dozer映射框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、Dozer 介绍
  • 二、Dozer的API映射方式
  • 三、使用
    • 1、java程序
    • 2、springboot项目
      • (1)引入依赖
      • (2)声明工具类
      • (3)工具类委托spring管理

一、Dozer 介绍

Dozer是一个Java工具,主要用于在相同类型或不同复杂类型的JavaBean之间进行数据的递归复制。这个工具在分层的J2EE系统中非常有用,尤其是在JavaBean之间的数据拷贝过程中。

Dozer的特点包括

  • 默认属性映射:如果两个JavaBean的属性名称相同,Dozer会自动将它们进行映射,而无需进行显式配置。
  • 自动类型转换:Dozer可以自动处理类型不同的属性映射,只要这些类型在Dozer可理解的范围内。这可以极大地提高开发效率。
  • 处理null属性:如果遇到null属性,Dozer会将对应的所有属性全部设置为null,而不会抛出NullPointerException。
  • 支持多种映射方式:Dozer支持注解、API和XML三种映射方式,使得开发者可以根据具体需求选择最适合的映射方式。
  • 支持复杂类型映射:Dozer不仅支持简单的属性映射,还支持复杂类型映射、双向映射、隐式显式的映射以及递归映射。

在常见的应用场景中,Dozer被广泛用于微服务中的实体转换,如从前端表单转换为业务实体,从业务实体转换为报表Dto等。由于其强大的功能和灵活性,Dozer成为了许多Java开发者在数据拷贝和对象转换方面的首选工具。

二、Dozer的API映射方式

通过Dozer提供的API(主要是DozerBeanMapper类)来定义和执行对象之间的映射操作。以下是关于Dozer API映射方式的更详细说明:

  • 创建DozerBeanMapper实例
    首先,你需要创建一个DozerBeanMapper的实例。这个实例是Dozer进行映射操作的核心。
DozerBeanMapper mapper = new DozerBeanMapper();
  • 使用map方法进行映射
    使用DozerBeanMapper的map方法,你可以将一个对象(源对象)映射到另一个对象(目标对象)。这个方法接受两个参数:源对象实例和目标对象的类类型。
SourceObject sourceObject = ... // 获取或创建源对象实例  
DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);

在这个例子中,sourceObject是你要映射的源对象,DestinationObject.class是目标对象的类类型。执行这个映射后,destObject将是一个新的实例,其属性值将从sourceObject中复制过来。

  • 映射规则

    • 名称匹配:Dozer使用属性名称进行匹配。只要源对象和目标对象具有相同名称的属性,这些属性就会被自动映射。
    • 数据类型转换:如果源对象和目标对象的属性类型不同,但Dozer能够理解并转换这些类型,那么它将自动执行类型转换。例如,从整数到字符串的转换。
    • 复杂类型映射:除了简单的属性映射外,Dozer还支持复杂类型映射,包括集合、数组、嵌套对象等。这意味着你可以将整个对象图从一个对象复制到另一个对象。
  • 自定义映射
    虽然Dozer提供了默认的映射规则,但你也可以通过编程方式自定义映射规则。这可以通过以下方式实现:

    • 字段映射注解:使用Dozer提供的注解(如@Mapping)来指定字段之间的映射关系。这允许你更精确地控制哪些字段应该被映射,以及如何进行映射。
    • 映射文件:Dozer还支持使用XML映射文件来定义映射规则。这些文件允许你指定更复杂的映射逻辑,包括条件映射、排除某些字段等。
  • 错误处理
    如果在映射过程中发生错误(例如,找不到匹配的属性或无法执行类型转换),Dozer将抛出异常。你需要编写代码来处理这些异常,例如记录错误消息、回滚事务等。

  • 性能考虑
    由于Dozer在运行时动态执行反射操作,因此在处理大量数据或执行频繁映射时可能会对性能产生影响。为了提高性能,你可以考虑以下策略:

    • 缓存DozerBeanMapper实例:不要为每个映射操作都创建新的DozerBeanMapper实例。相反,创建一个实例并将其缓存起来以供重复使用。
    • 使用预编译的映射文件:如果你使用XML映射文件来定义映射规则,请确保在应用程序启动时预编译这些文件。这将减少在运行时解析XML文件的开销。
    • 减少不必要的映射:只映射真正需要的字段,避免不必要的复制和转换操作。

三、使用

1、java程序

<dependency><groupId>com.github.dozermapper</groupId><artfactid>dozer-core</artfactid><version>6.5.0</version>
</dependency>

2、springboot项目

(1)引入依赖

        <dependency><groupId>com.github.dozermapper</groupId><artifactId>dozer-spring-boot-starter</artifactId><version>6.5.0</version></dependency>

(2)声明工具类

package com.ksyun.gov.kdmp.ms.asset.util;import com.github.dozermapper.core.Mapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.*;
import java.util.stream.Collectors;public class DozerUtils {private static final Logger LOGGER = LoggerFactory.getLogger(DozerUtils.class);private Mapper mapper;public DozerUtils(Mapper mapper) {this.mapper = mapper;}public Mapper getMapper() {return this.mapper;}/*** Constructs new instance of destinationClass and performs mapping between from source**/public <T> T map(Object source, Class<T> destinationClass) {if (source == null) {return null;}return mapper.map(source, destinationClass);}public <T> T map2(Object source, Class<T> destinationClass) {if (source == null) {try {return destinationClass.newInstance();} catch (Exception e) {LOGGER.error(e.getMessage(), e);}}return mapper.map(source, destinationClass);}/*** Performs mapping between source and destination objects**/public void map(Object source, Object destination) {if (source == null) {return;}mapper.map(source, destination);}/*** Constructs new instance of destinationClass and performs mapping between from source**/public <T> T map(Object source, Class<T> destinationClass, String mapId) {if (source == null) {return null;}return mapper.map(source, destinationClass, mapId);}/*** Performs mapping between source and destination objects**/public void map(Object source, Object destination, String mapId) {if (source == null) {return;}mapper.map(source, destination, mapId);}/*** 将集合转成集合* List<A> -->  List<B>** @param sourceList       源集合* @param destinationClass 待转类型*/public <T, E> List<T> mapList(Collection<E> sourceList, Class<T> destinationClass) {return mapPage(sourceList, destinationClass);}public <T, E> List<T> mapPage(Collection<E> sourceList, Class<T> destinationClass) {if (sourceList == null || sourceList.isEmpty() || destinationClass == null) {return Collections.emptyList();}List<T> destinationList = sourceList.stream().filter(Objects::nonNull).map((sourceObject) -> mapper.map(sourceObject, destinationClass)).collect(Collectors.toList());return destinationList;}public <T, E> Set<T> mapSet(Collection<E> sourceList, Class<T> destinationClass) {if (sourceList == null || sourceList.isEmpty() || destinationClass == null) {return Collections.emptySet();}return sourceList.stream().map((sourceObject) -> mapper.map(sourceObject, destinationClass)).collect(Collectors.toSet());}
}

(3)工具类委托spring管理

@Configuration
public class DozerAutoConfiguration {@Beanpublic DozerUtils getDozerUtils(Mapper mapper) {DozerUtils dozerUtils = new DozerUtils(mapper);return dozerUtils;}
}

参考: https://www.php.cn/faq/536645.html

这篇关于Java基础学习:Dozer映射框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968408

相关文章

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一