Java 对象映射 数据库表映射 工具类 两个对象/表实现映射转换

场景:需要将一个对象的各个字段中的数据映射到另一个对象的字段数据中,或将一个数据库表映射到另一张表中。

本文使用泛型编程实现了一个对象映射功能的工具类。

需要源对象,映射关系map,目标类。由于是动态的类,所以使用Java的反射机制来获取字段名,填写字段数据。

除了一个映射工具类,还手动实现了一个类型转换工具类,保证在映射过程中的数据类型安全性。

数据映射工具类:DataMappingUtils .java

package com.xxxx.util;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class DataMappingUtils {// source:原始数据, fieldMap:映射关系(sourceField,targetField), targetClass:目标对象类型// 映射单个对象public static <T> T dataMapping(Map<String,Object> source, Map<String, String> fieldMap, Class<T> targetClass) {try {T target = targetClass.getDeclaredConstructor().newInstance();for (Map.Entry<String,String> entry : fieldMap.entrySet()) {String sourceField = entry.getKey();String targetField = entry.getValue();Object sourceValue = source.get(sourceField);if (sourceValue == null) continue;try {Field field = targetClass.getDeclaredField(targetField);field.setAccessible(true);Object convertedValue = TypeConvertUtils.convertValue(sourceValue,field.getType());field.set(target,convertedValue);} catch (NoSuchFieldException e) {throw new RuntimeException("目标对象不存在字段: " + targetField);}}return target;} catch (Exception e) {throw new RuntimeException("对象映射失败: " + e.getMessage(),e);}}// 批量映射public static <T> List<T> mapList(List<Map<String,Object>> sourceList, Map<String,String> fieldMap, Class<T> targetClass) {List<T> resultList = new ArrayList<>();for (Map<String, Object> sourceEntity : sourceList) {resultList.add(dataMapping(sourceEntity,fieldMap,targetClass));}return resultList;}
}

类型转换工具类(使用了阿里巴巴的fastjson依赖):TypeConvertUtils .java

package com.xxx.util;import com.alibaba.fastjson.JSON;import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class TypeConvertUtils {public static Object convertValue(Object value, Class<?> targetType) {if (value == null) {return null;}String stringValue = value.toString();if (targetType == String.class) {return stringValue;} else if (targetType == Integer.class || targetType == int.class) {return Integer.parseInt(stringValue);} else if (targetType == Double.class || targetType == double.class) {return Double.parseDouble(stringValue);} else if (targetType == Long.class || targetType == long.class) {return Long.parseLong(stringValue);} else if (targetType == Boolean.class || targetType == boolean.class) {return Boolean.parseBoolean(stringValue);} else if (targetType == Date.class) {try {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(stringValue);} catch (ParseException e) {throw new RuntimeException("日期格式错误: " + stringValue);}} else if (targetType == BigDecimal.class) {return new BigDecimal(stringValue);} else {// 如果字段是复杂对象,使用JSON反序列化 (fastjson依赖)return JSON.parseObject(stringValue, targetType);}}
}

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

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

相关文章

Linux离线搭建Jenkins

Linux离线搭建Jenkins(centos7) Jenkins简介: Jenkins只是一个平台&#xff0c;真正运作的都是插件。这就是jenkins流行的原因&#xff0c;因为jenkins什么插件都有&#xff0c;Hudson是Jenkins的前身&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控程序重…

从零学习linux(2)——管理

一.用户管理 1.用户属性 用户名、口令、用户ID&#xff08;UID&#xff09;、用户主目录&#xff08;HOME&#xff09;、用户shell 2. 3. 4.adduser添加用户 语法&#xff1a;adduser 用户名 如# adduser superw 添加用户名为superw的新用户 5.deluser删除用户 语法&am…

《贵州棒垒球》有什么国家级比赛·棒球1号位

中国国家级棒球比赛盘点 | 小白入门指南 3月 | 中国棒球联赛 (China Baseball League) 国内最高水平职业联赛&#xff0c;各省市职业队角逐冠军&#xff01; 英文&#xff1a;Top-tier professional event with teams nationwide. 5月 | 全国青年棒球锦标赛 (National Youth …

该项目名为“EduPal“,AI推荐

## 完整代码实现 ### 后端代码 (app.py) python import os import json import uuid import requests from datetime import datetime from flask import Flask, render_template, request, jsonify from dotenv import load_dotenv # 加载环境变量 load_dotenv() app …

C++法则15:匹配失败并不是一种错误(Substitution Failure Is Not An Error)。

C法则15&#xff1a;匹配失败并不是一种错误(Substitution Failure Is Not An Error)。 应用例子&#xff1a; SFINAE &#xff1a;关于is_class&#xff0c;is_base_of&#xff0c;C编译器的魔法器&#xff0c;如何实现&#xff0c;is_class&#xff0c;is_base_of。_c is cl…

Ollama客户端 + Docker搭建本地知识库(Mac系统)

一、环境准备 1. 安装Ollama客户端 官网下载&#xff1a;https://ollama.com 验证安装&#xff1a; ollama --version2. 安装Docker Desktop 下载地址&#xff1a;https://www.docker.com/products/docker-desktop 安装后确保Docker状态为"Running" 二、基础搭建…

FastMCP 2.9 版本详解:MCP 原生中间件与类型转换增强

下面我将从三个方面来讲解这个&#xff0c;第一是讲解2.9版本的更新&#xff0c;第二是讲解什么将手动解析底层JSON-RPC 消息&#xff0c;丢失 FastMCP 高层语义&#xff0c;第三是讲一讲&#xff0c;什么叫做中间件。不了解的兄弟们系好安全带&#xff0c;我们准备发车了&…

LTspice仿真6——PWL折线波产生

1.自定义波形 2.自定义波形周期 3.以文件.txt的形式定义折线波 4.通过C语言编程&#xff0c;一系列操作&#xff0c;生成自定义正弦波&#xff08;可自定义性强&#xff09;

FunASR搭建语音识别服务和VAD检测

调整VAD参数 1. 查找VAD模型的配置文件 FunASR中的VAD模型为FSMN-VAD&#xff0c;参数配置类为VADXOptions&#xff0c;可以在以下路径中找到&#xff1a; /workspace/FunASR/runtime/python/onnxruntime/funasr_onnx/utils/e2e_vad.py 其中&#xff0c;VADXOptions类定义了…

多模态大模型(从0到1)

文章目录 一、多模态大模型二、常见模态组合 典型应用场景三、多模态&#xff08;模型 框架&#xff09;1. 多模态模型2. 多模态框架 —— 开源项目推荐&#xff08;可快速上手&#xff09; 四、入门与学习路线1. 理论基础2. 主流多模态模型实战3. 进阶与应用拓展&#x1f4d…

# Vue.js 精确轮播组件实现详解

## &#x1f4d6; 概述 本文详细介绍了一个基于 Vue.js 开发的高精度轮播组件&#xff0c;该组件实现了精确的卡片对齐和平滑滚动效果。组件支持混合布局&#xff08;大卡片网格布局&#xff09;&#xff0c;具备智能位置计算和精确滚动控制功能。 ## ✨ 组件特点 ### &#x1…

将RESP.app的备份数据转码成AnotherRedisDesktopManager的格式

将RESP.app的备份数据转码成AnotherRedisDesktopManager的格式 最近发现了AnotherRedisDesktopManager&#xff0c;这个软件可以直接展示proto数据。 将RESP.app导出的json文件&#xff0c;转码为AnotherRedisDesktopManager的ano文件&#xff08;是一个list转了base64&#xf…

前端基础知识JavaScript系列 - 09(JavaScript原型,原型链 )

一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个…

vue3+ts 使用VueCropper实现剪切图片

效果图&#xff1a; 参考文档&#xff1a; Vue-Cropper 文档Vue-Cropper 文档 安装VueCropper //npm安装 npm install vue-croppernext -d --save//yarn安装 yarn add vue-croppernext 引入组件 在main.ts中全局注册&#xff1a; import VueCropper from vue-cropper; i…

el-table特殊表头样式

el-table特殊表头样式 实现表头是按钮 <el-table-column align"center"><template slot"header"><el-buttonsize"mini"type"primary"icon"el-icon-plus"circleclick"addData"></el-button&g…

el-tree的属性render-content自定义样式不生效

需求是想要自定义展示el-tree的项&#xff0c;官网有一个:render-content属性&#xff0c;用的时候发现不管是使用class还是style&#xff0c;样式都没有生效&#xff0c;还会报一个错&#xff0c;怎么个事呢&#xff0c;后来发现控制台还会报一个错“vue.js:5129 [Vue warn]: …

银杏书签里的春天

春末的细雨沾湿了旧书扉页&#xff0c;我在泛黄的《飞鸟集》里发现那枚银杏书签时&#xff0c;窗外的梧桐树正抖落最后一片枯叶。深褐色的叶脉间夹着张字条&#xff0c;娟秀的字迹被岁月晕染&#xff1a;"给永远在奔跑的人。" 十年前的我在旧书店打工&#xff0c;每天…

spring-ai 1.0.0 学习(十四)——向量数据库

向量数据库是AI系统中常用的工具&#xff0c;主要用来存储文档片段及进行语义相似度查找 与传统数据库不同&#xff0c;它执行的是相似度查找而不是精确匹配 最小化样例 首先在application.properties中&#xff0c;根据所用Embedding模型&#xff0c;添加一个嵌入式模型型号…

Spring Boot 的Banner的介绍和设置

Spring Banner 是指在 Spring Boot 应用启动时,控制台上显示的那一段 ASCII 艺术字(通常是 Spring 的 logo),以及一些应用信息。 Banner 是 Spring Boot 提供的一个小但有趣的功能,可以让应用程序启动时更具个性也显得更高级。 默认 Banner Spring Boot 内置了一个默认…

魅族“换血”出牌:手机基本盘站不稳,想靠AI和汽车“改命”

撰稿|何威 来源|贝多财经 被吉利收购后&#xff0c;魅族逐渐转向在AI领域躬身耕作。 自2024年2月以“All in AI”正式宣告转型、喊出不再推出传统智能手机的豪言开始&#xff0c;这家曾以设计见长的手机厂商&#xff0c;将下半场押注在AI终端、AR眼镜与智能座舱系统上&#…