SpringBoot中DTO/VO/Entity相互转换详解

 更新时间:2025年01月22日 09:50:18   作者:会说法语的猪  
在我们平时开发中,dto、vo、entity之间的相互转换是很频繁的操作,这篇文章就简单记录一下在平时开发中SpringBoot的转换方法,希望对大家有所帮助

在我们平时开发中,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转为vo
        TestJsonVo 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返回给前端。

以上就是SpringBoot中DTO/VO/Entity相互转换详解的详细内容,更多关于SpringBoot DTO VO Entity相互转换的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot统一API响应结果封装的示例详解

    SpringBoot统一API响应结果封装的示例详解

    在Spring Boot项目中,统一API响应结果封装是一种常用的技术实践,旨在提高开发效率、降低代码重复率,并提供一致的API响应格式,从而简化前后端交互和错误处理,感兴趣的小伙伴可以了解下
    2025-03-03
  • java生成随机数的方法

    java生成随机数的方法

    这篇文章主要介绍了java生成随机数的方法,涉及java随机数及字符串操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Java实现二叉树的建立、计算高度与递归输出操作示例

    Java实现二叉树的建立、计算高度与递归输出操作示例

    这篇文章主要介绍了Java实现二叉树的建立、计算高度与递归输出操作,结合实例形式分析了Java二叉树的创建、遍历、计算等相关算法实现技巧,需要的朋友可以参考下
    2019-03-03
  • 详解5种Java中常见限流算法

    详解5种Java中常见限流算法

    在高并发系统中,出于系统保护角度考虑,通常会对流量进行限流;不但在工作中要频繁使用,而且也是面试中的高频考点。本文就为大家整理了5种Java中常见限流算法,需要的可以参考一下
    2023-04-04
  • Java 入门图形用户界面设计之单选按钮

    Java 入门图形用户界面设计之单选按钮

    图形界面(简称GUI)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受,本篇精讲Java语言中关于图形用户界面的单选按钮
    2022-02-02
  • Java 中的 synchronized 关键字详解

    Java 中的 synchronized 关键字详解

    本文详细介绍了Java中的synchronized关键字,包括其基本概念、工作原理、使用场景、性能优化技巧以及常见问题与解决方案,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • Springboot项目保存本地系统日志文件的实现方法

    Springboot项目保存本地系统日志文件的实现方法

    这篇文章主要介绍了Springboot项目保存本地系统日志文件的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java内存之happens-before和重排序

    Java内存之happens-before和重排序

    在JMM(Java内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。下面小编来简单介绍一下
    2019-05-05
  • 将Java项目打包成可执行的jar包

    将Java项目打包成可执行的jar包

    这篇文章主要介绍了将Java项目打包成可执行的jar包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java项目时的命名规范使用及说明

    Java项目时的命名规范使用及说明

    文章总结了SpringBoot项目命名规范,包括项目、包、类、方法、变量、配置文件、Starter、API、数据库和其它命名规则,以确保代码的一致性和可读性
    2026-01-01

最新评论