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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10下,svn上传.so文件失败

问题&#xff1a;win10下使用TortoiseSVN&#xff0c;svn上传.so文件失败 解决&#xff1a;右键&#xff0c;选择Settings&#xff0c;Global ignore pattern中删除*.so&#xff0c;保存即可。

设置多用户远程登录windows server服务器

##设置多用户远程登录windows server服务器 ###1、远程登录windows server 2016 运行—>mstsc—>远程IP地址—>用户和密码 2、远程windows服务器设置多用户策略 运行—>gpedit.msc->计算机配置—管理模板—windows组件—远程桌面服务—远程桌面会话主机----连…

Unity调用智谱API(简单操作 文本实时翻译)

代码展示&#xff1a; using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI;public class ZhiPuAi : MonoBehaviour {// API的端点URLpublic string…

linux复习

与"区别 在Linux中&#xff0c;单引号&#xff08;&#xff09;和双引号&#xff08;"&#xff09;用于定义字符串&#xff0c;但它们在处理变量扩展和转义字符时有所不同。以下是具体分析&#xff1a; 1. **变量扩展**&#xff1a;在双引号内&#xff0c;变量可以…

阿里巴巴1688商品详情API返回值深度剖析:精准获取商品信息的关键

在电子商务日益繁荣的今天&#xff0c;阿里巴巴1688作为中国领先的B2B平台&#xff0c;汇聚了海量的供应商和商品信息。对于商家、开发者以及希望深入了解商品数据的用户来说&#xff0c;如何通过有效的方式获取这些商品信息成为了一个重要议题。阿里巴巴1688商品详情API的出现…

Semi-decentralized Federated Ego Graph Learning for Recommendation

论文概况 本文是2023年WWW的一篇联邦推荐论文&#xff0c;提出了一个半去中心化的联合自我图学习框架。 Introduction 作者提出问题 现有的推荐方法收集所有用户的自我图来组成一个全局图&#xff0c;导致隐私风险。联合推荐系统已被提出来缓解隐私问题&#xff0c;但在客户…

zabbix监控方式(zabbix-trapper)

中文&#xff1a;zabbix采集器&#xff0c;即zabbix sender 。 Zabbix-Trapper 监控方式可以一次批量发送数据给Zabbix Server&#xff0c;与主动模式不同&#xff0c;Zabbix-Trapper 可以让用户控制数据的发送&#xff0c;而不用Zabbix-Agent进程控制&#xff0c;这意味着可以…

PE文件(四)FileBuffer-ImageBuffer

文件执行的总过程 当文件从硬盘中读入虚拟内存&#xff08;FileBuffer&#xff09;中时&#xff0c;文件数据会被原封不动的复制一份到虚拟内存中&#xff0c;然后进行拉伸对齐。此时虚拟内存中文件数据叫做文件印象或者内存印象&#xff0c;即ImageBuffer。此时ImageBuffer中…

42.乐理基础-拍号-看懂拍号的意义

到这必然是已经知道 X、Y的意思了&#xff1a; 然后带入数字&#xff1a; 然后念拍号的时候&#xff0c;在国内&#xff0c;百分之九十的地方是从下往上念&#xff0c;念作四二拍&#xff0c;还有百分之十的地方是和国外一样&#xff0c;从上往下念&#xff0c;念作二四拍&…

使用vant组件库

官方文档&#xff1a;Vant 4 - A lightweight, customizable Vue UI library for mobile web apps. vue2对应vant2&#xff0c;vue3对应vant3/vant4 1.安装 官网的快速上手里都有介绍。 # Vue 3 项目&#xff0c;安装最新版 Vant&#xff1a; npm i vant -S# Vue 2 项目&am…

跨境支付行业研究

1. 行业基本情况 随着全球人均购买力增强、互联网普及率提升、支付渠道的进一步成熟、物流等配套设施的完善&#xff0c;网络购物已经成为全球兴起的消费习惯。另一方面&#xff0c;跨境电商对传统贸易的替代已经成为趋势。跨境电商在交易成本和便利程度上都有明显的优势 图1 …

【问题记录】ORA-31603 对象 ““ 属于类型 , 在方案 ““ 中未找到,存储过程procedure执行报错

文章目录 问题&#xff1a;解决方法 问题&#xff1a; ORA-31603: 对象 “V_RST_UTC01390” 属于类型 VIEW, 在方案 “RISKCONFIG_BAK” 中未找到 ORA-06512: 在 “SYS.DBMS_METADATA”, line 5805 ORA-06512: 在 “SYS.DBMS_METADATA”, line 8344 ORA-06512: 在 line 1&…

大数据API技术分享:使用API接口采集淘宝数据(商品详情丨关键词搜索丨店铺所有商品)

使用API接口采集淘宝数据&#xff08;商品详情、关键词搜索、店铺所有商品&#xff09;是大数据领域常见的应用场景。以下是一些关于如何使用API接口进行这些操作的技术分享&#xff1a; 1. 获取API权限 首先&#xff0c;你需要在淘宝开放平台注册成为开发者&#xff0c;并创建…

想做视频号小店,为何不建议开通个体店?开店步骤+做店思路如下

我是王路飞。 如果你想在视频号开通店铺的话&#xff0c;那么一定不要使用个体执照开通个体店&#xff1f; 这是为什么呢&#xff1f; 原因很简单&#xff0c;视频号个体店是无法入驻优选联盟的&#xff0c;只能企业店可以入驻。 因为现阶段视频号小店的自然流量很少&#…

五一 作业

#include <iostream>using namespace std; class Num { private:int a; public:Num() {}Num(int a):a(a){}//设置a的值void set(int a){this->aa;}//1-a的和void Sum(){if(a<1){cout<<"a<1"<<endl;return;}int sum0;for(int i1;i<a;i)…

开源模型应用落地-CodeQwen模型小试-探索更多使用场景(三)

一、前言 代码专家模型是基于人工智能的先进技术&#xff0c;它能够自动分析和理解大量的代码库&#xff0c;并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议&#xff0c;帮助开发人员在编写代码时避免常见的错误和陷阱。 通过学习代码专家模型&…

使用QT开发ROS可视化界面

Q&#xff1a; undefined reference to non-virtual thunk to MyViz A&#xff1a; 该问题主要由于QT中的MOC File没有正确生成&#xff0c;导致虚函数列表出现问题。另外&#xff0c;需要注意虚函数的virtual关键字需要放在类的声明&#xff0c;不能放在类的定义。 qt5_wrap…

获取Android Native堆栈

文章目录 工具和方法获取当前线程的堆栈信息获取任意线程的堆栈信息GCC生成符号的规律总结 在Android系统中&#xff0c;我们有时需要获取Native层的堆栈信息&#xff0c;例如在进行性能分析、问题定位和调试等场景。本文将介绍如何在Android Native层获取堆栈信息&#xff0c;…

计算机视觉——OpenCV Otsu阈值法原理及实现

算法简介 Otsu阈值法&#xff0c;也被称为大津算法&#xff0c;是一种在图像处理中广泛使用的自动阈值分割技术。这种方法由日本学者大津展之于1979年提出&#xff0c;旨在根据图像的灰度直方图来自动选择最佳全局阈值。Otsu阈值法的核心思想是最小化类内方差或最大化类间方差…

《设计一款蓝牙热敏打印机》

主控芯片用易兆威蓝牙ic&#xff0c;通讯接口&#xff1a;蓝牙、串口、usb 安卓apk用java kotlin编写、上位机用Qt编写。