springboot中DTO、VO、Entity相互转换

在我们平时开发中,dto、vo、entity之间的相互转换是很频繁的操作,这篇就简单记录一下我在平时开发中转换的方法。

在这之前先简单描述一下dto、vo、entity

DTO:一般我们在开发中会定义数据传输对象(Data Transfer Object, DTO)来接收前端传递的参数是最常见的。

VO:平时开发中,一般会定义VO(view object)来封装返回给前端的数据

Entity:在我们开发中,Entity适用于表示持久化对象的核心组件之一。它通常与数据库中的表直接对应,用于映射数据库记录到应用程序的对象

我们在平时的增删改查中,简单来说就是

就像新增操作,一般会使用dto来接受前端传递的参数,然后将dto转为Entity,再set一些创建时间之类的字段,然后再将Entity实体对象数据插入到数据库中。

查询操作,先从数据库查询出数据即Entity,然后再将Entity转为VO视图数据,再返回给前端。

我这里平时开发中,会使用下面封装的工具类来进行dto、vo、entity之间的转换,代码如下:

首先pom.xml引入依赖:

<!-- JSON 解析器和生成器 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>

封装JSONUtil类 

package com.wft.utils;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.util.List;
import java.util.Map;public class JsonUtil {public JsonUtil() {}public static List listToJsonField(List lists) {String jsonStr = JSONArray.toJSONString(lists, new SerializerFeature[]{SerializerFeature.WriteMapNullValue});List list = (List)JSONArray.parseObject(jsonStr, List.class);return list;}public static Map<String, Object> entityToMap(Object object) {String jsonStr = JSONObject.toJSONString(object);Map<String, Object> map = (Map)JSONObject.parseObject(jsonStr, new TypeReference<Map<String, Object>>() {}, new Feature[0]);return map;}public static Map<String, String> entityToMaps(Object object) {String jsonStr = JSONObject.toJSONString(object);Map<String, String> map = (Map)JSONObject.parseObject(jsonStr, new TypeReference<Map<String, String>>() {}, new Feature[0]);return map;}public static Map<String, Object> stringToMap(String object) {Map<String, Object> map = (Map)JSONObject.parseObject(object, new TypeReference<Map<String, Object>>() {}, new Feature[0]);return map;}public static <T> T getJsonToBean(String jsonData, Class<T> clazz) {return JSON.parseObject(jsonData, clazz);}public static JSONArray getJsonToJsonArray(String json) {return JSONArray.parseArray(json);}public static <T> JSONArray getListToJsonArray(List<T> list) {return JSONArray.parseArray(getObjectToString(list));}public static String getObjectToString(Object object) {return JSON.toJSONString(object, new SerializerFeature[]{SerializerFeature.WriteMapNullValue});}public static String getObjectToStringDateFormat(Object object, String dateFormat) {return JSON.toJSONStringWithDateFormat(object, dateFormat, new SerializerFeature[]{SerializerFeature.WriteMapNullValue});}public static <T> List<T> getJsonToList(String jsonData, Class<T> clazz) {return JSON.parseArray(jsonData, clazz);}public static List<Map<String, Object>> getJsonToListMap(String jsonData) {return (List)JSON.parseObject(jsonData, new TypeReference<List<Map<String, Object>>>() {}, new Feature[0]);}public static List<Map<String, Object>> getJsonToList(JSONArray jsonArray) {return (List)JSON.parseObject(JSON.toJSONString(jsonArray), new TypeReference<List<Map<String, Object>>>() {}, new Feature[0]);}public static <T> T getJsonToBean(Object dto, Class<T> clazz) {return JSON.parseObject(getObjectToString(dto), clazz);}public static <T> List<T> getJsonToList(Object dto, Class<T> clazz) {return JSON.parseArray(getObjectToString(dto), clazz);}
}

平时使用中我一般使用最多的就是JsonUtil.getJsonToBean方法,就是进行dto、vo、entity对象之间的相互转换,简单聚个例子如下:

示例:

前端传递DTO(name、age、birthTime)过来,然后我们转为VO(ame、age、birthTime、creatorTime)并返回。

DTO类:

package com.wft.model.testJson;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;@Data
public class TestJsonForm {/** 姓名 **/@JsonProperty("name")private String name;/** 年龄 **/@JsonProperty("age")private Integer age;/** 出生日期 **/@JsonProperty("birthTime")private String birthTime;}

 VO:

package com.wft.model.testJson;import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;import java.util.Date;@Data
public class TestJsonVo {@JSONField(name = "name")private String name;@JSONField(name = "age")private Integer age;@JSONField(name = "birthTime")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date birthTime;@JSONField(name = "birthTime")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date creatorTime;
}

Controller:

package com.wft.controller;import com.wft.model.ActionResult;
import com.wft.model.testJson.TestJsonForm;
import com.wft.model.testJson.TestJsonVo;
import com.wft.utils.JsonUtil;
import org.springframework.web.bind.annotation.*;import java.util.Date;@RestController
@RequestMapping("/json")
public class TestJsonController {@PostMapping("/save")public ActionResult uploadTest(@RequestBody TestJsonForm testJsonForm) {// 将dto转为voTestJsonVo vo = JsonUtil.getJsonToBean(testJsonForm, TestJsonVo.class);vo.setCreatorTime(new Date());return ActionResult.success(vo);}}

@JsonProperty

大家能看到DTO中,我使用了 @JsonProperty 注解,这个很简单,其实就是标识前端传递的参数字段是什么,就是允许我们后端接受的参数字段和前端传递的字段可以不一致,如果不一致我们后端就可以使用@JsonProperty进行映射。

上面我们定义的name字段,如果前端传递的字段为cusname,我们就可以在name字段上使用这样的注解@JsonProperty("cusname")这样设置。

@JSONField

同样的我在VO中使用@JSONField注解,上面的例子是把DTO转为VO,VO中的@JSONField对应的就是DTO中的字段

其实我们平时开发中,只要字段都对应好,完全不需要使用这两个注解。 

上面VO中还使用了@JsonFormat 注解,这个是格式化时间的,将Date类型转为String类型yyyy-MM-dd HH:mm:ss返回给前端。 

好,这篇就这样儿~~~

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

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

相关文章

第四十七章 Spring之假如让你来写MVC——闪存管理器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

Python 脚本-扫描当前目录和所有子目录并显示它们的大小。

目录 1.Python 代码实现 2.Python 代码解释&#xff08;部分&#xff09; 1. 模块导入 2. ANSI 颜色编码 3. format_size 函数 4.get_directory_size 函数 5. scan_directory 函数 6. display_progress 函数 7. main 函数 3.运行脚本 3.1 基本用法 3.2 使用详…

基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

C语言基本知识

基础 存储类 auto&#xff1a;用完即丢。其实就是局部变量。 static&#xff1a;本文件的全局变量。 extern&#xff1a;只声明&#xff0c;不定义&#xff0c;引用外部变量。 register&#xff1a;放在寄存器而不是内存。 //auto {auto int month; // 等于int mount; …

使用批处理文件清除系统垃圾

第一步&#xff1a;打开记事本&#xff0c;里面的命令如下 echo off echo 正在清理临时文件&#xff0c;请稍候...:: 清理系统临时文件 echo 清理系统临时文件... del /q /f /s "%TEMP%\*.*" del /q /f /s "%WINDIR%\Temp\*.*" rd /s /q "%WINDIR%\T…

更新布局元素的属性

每个布局元素都有一组可以通过编程来更新的属性.布局元素有很多种不同的类型,如图例,图形,文本,地图整饰等等. 操作方法: 1.打开目标活动地图文档 2.打开python窗口 3.导入arcpy模块 import arcpy.mapping as mapping 4.引用当前活动地图文档,把该引用赋值给变量 mxd map…

计算最接近的数

计算最接近的数 真题目录: 点击去查看 E B卷 100分题型 题目描述 给定一个数组X和正整数K&#xff0c;请找出使表达式&#xff1a; X[i] - X[i 1] - … - X[i K - 1] 结果最接近于数组中位数的下标 i &#xff0c;如果有多个 i 满足条件&#xff0c;请返回最大的 i. 其中&…

Linux——信号量和(环形队列消费者模型)

Linux——线程条件变量&#xff08;同步&#xff09;-CSDN博客 文章目录 目录 文章目录 前言 一、信号量是什么&#xff1f; 二、信号量 1、主要类型 2、操作 3、应用场景 三、信号量函数 1、sem_init 函数 2、sem_wait 函数 3、sem_post 函数 4、sem_destroy 函数 ​​​​​​…

简识JVM私有内存区域栈、数据结构

前记&#xff1a;JVM稀有内存区域栈包含&#xff1a;虚拟机栈、本地方法栈、程序计数器&#xff1b; 在JVM&#xff08;Java虚拟机&#xff09;中&#xff0c;私有内存区域栈主要指的是虚拟机栈&#xff08;VM Stack&#xff09;和本地方法栈&#xff08;Native Method Stack&…

垂直供排水抢险车:守护城市,抗击洪涝|深圳鼎跃

我国面积幅员辽阔&#xff0c;其灾害种类多样&#xff0c;而洪涝灾害是其中最常见的灾害&#xff0c;其容易受强降雨的影响&#xff0c;严重影响人民群众的日常生活。而在洪水肆虐的场景中&#xff0c;快速、高效地排涝和供水是防止次生灾害、保护人民生命财产安全的关键环节。…

Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译

概要 行人遵循不同轨迹以避免障碍物和容纳同行者。任何在这种场景中巡航的自动驾驶车辆都需要能够遇见行人的未来位置并相应地调整其路线以避免碰撞。轨迹预测问题能够被看作一个顺序生成任务&#xff0c;其中我们对基于行人过去的位置预测其未来的轨迹感兴趣。根据最近RNN&am…

React+AntDesign实现类似Chatgpt交互界面

以下是一个基于React和Ant Design搭建的简单ChatGPT风格前端交互界面代码框架示例&#xff0c;该示例实现了基本的用户输入、发送请求以及展示回复的功能。假设后端有一个模拟接口来处理请求并返回回复。 1. 项目初始化&#xff1a; 确保你已经安装了Node.js和npm。通过以下命…

与“神”对话:Swift 语言在 2025 中的云霓之望

0. 引子 夜深人静&#xff0c;是一片极度沉醉的黑&#xff0c;这便于我与深沉的 macbook 悄悄隐秘于其中。一股异香袭来&#xff0c;恍惚着&#xff0c;撸码中身心极度疲惫、头脑昏沉的我仿佛感觉到了一束淡淡的微光轻洒在窗边。 我的对面若隐若现逐渐浮现出一个熟悉的身影。他…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中&#xff0c;网络请求是常见且致其重要的功能之一。从获取资料到上传数据&#xff0c;出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架&#xff0c;提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

【0397】Postgres内核 checkpoint process ⑦ 获取 delaying checkpoint VXIDs(delayChkpt)

1. Top-level transactions 顶级事务(Top-level transactions)通过由 PGPROC 字段 backendId 和 lxid 组成的 VirtualTransactionIDs 来标识。对于已准备的事务,LocalTransactionId 是一个普通的 XID。这些在短期内保证唯一,但在数据库重启或 XID 滚转后会被重新使用;因此…

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…

IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载

IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载 在 IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载&#xff0c;可以让你在不重启应用的情况下看到代码修改的效果。以下是详细的配置步骤&#xff1a; 添加 spring-boot-devtools 依赖 在 pom.xml 文件中添加 …

使用HTML5 Canvas 实现呼吸粒子球动画效果的原理

在网页开发领域&#xff0c;动画效果能够极大地提升用户体验&#xff0c;让页面变得更加生动有趣。今天&#xff0c;我们深入剖析一个基于 HTML5 Canvas 的 3D 粒子动画 —— 呼吸粒子球。通过详细解读其代码实现&#xff0c;我们将全面了解如何运用 HTML5 的强大功能构建出如此…

【C++】引用(上)

1、引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型&#xff08;该数据类型要与原名的数据类型一致&#xff09; &别名原名&#xff1b; 示例&#xff1a; #include<iostream> using namespace std; int main() {int a 10;int& …

JDBC实验测试

一、语言和环境 实现语言&#xff1a;Java。 环境要求&#xff1a;IDEA2023.3、JDK 17 、MySQL8.0、Navicat 16 for MySQL。 二、技术要求 该系统采用 SWING 技术配合 JDBC 使用 JAVA 编程语言完成桌面应用开发。 三、功能要求 某电商公司为了方便客服查看用户的订单信…