springboot入门-DTO数据传输层

在 Spring Boot 应用中,DTO(Data Transfer Object,数据传输对象) 是专门用于在不同层(如 Controller 层、Service 层、外部系统)之间传输数据的对象。它的核心目的是解耦数据模型和业务逻辑,避免直接暴露数据库实体(Entity)的结构,同时优化数据传输的效率和安全性。以下是 DTO 层的详细说明及使用场景:


1. DTO 的作用

场景作用
屏蔽敏感数据过滤掉实体类中不应暴露的字段(如密码、密钥)。
减少网络传输数据量仅返回前端需要的字段,避免传输冗余数据。
数据聚合与转换将多个实体类的字段组合成一个对象,简化接口响应。
版本兼容性允许接口参数和响应独立变化,不影响数据库表结构。
校验与安全性在 DTO 层定义数据校验规则(如 @NotBlank),防止非法数据进入业务逻辑。

2. DTO 与 Entity 的区别

特性DTOEntity(实体类)
用途数据传输(如接口请求/响应)映射数据库表结构
字段设计仅包含必要字段包含所有表字段
数据校验支持 javax.validation 注解通常不涉及校验(由 DTO 处理)
生命周期仅在请求/响应过程中存在与数据库操作绑定(如 JPA 管理)
嵌套对象可聚合多个实体类的数据通常对应单表或关联表结构

3. DTO 层的实现步骤

(1) 定义 DTO 类

根据业务需求设计请求和响应 DTO:

// 请求 DTO(用于创建用户)
public class UserCreateRequest {@NotBlankprivate String name;@Emailprivate String email;// Getter & Setter
}// 响应 DTO(用于返回用户信息)
public class UserResponse {private Long id;private String name;private String email;// Getter & Setter
}
(2) 在 Controller 中使用 DTO

将 DTO 作为接口参数和返回值:

@RestController
@RequestMapping("/api/users")
public class UserController {private final UserService userService;// 创建用户(接收 DTO,返回 DTO)@PostMappingpublic UserResponse createUser(@Valid @RequestBody UserCreateRequest request) {User user = userService.createUser(request);return convertToResponse(user);}// Entity 转 DTOprivate UserResponse convertToResponse(User user) {UserResponse response = new UserResponse();response.setId(user.getId());response.setName(user.getName());response.setEmail(user.getEmail());return response;}
}
(3) Service 层处理 DTO

将 DTO 转换为 Entity 后操作数据库:

@Service
public class UserService {private final UserRepository userRepository;public User createUser(UserCreateRequest request) {User user = new User();user.setName(request.getName());user.setEmail(request.getEmail());return userRepository.save(user);}
}

4. DTO 的最佳实践

(1) 使用工具简化转换

手动编写转换代码繁琐,推荐使用工具:

  • MapStruct(类型安全、高性能):
    @Mapper
    public interface UserMapper {UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);UserResponse toResponse(User user);
    }
    
  • ModelMapper(自动映射):
    ModelMapper modelMapper = new ModelMapper();
    UserResponse response = modelMapper.map(user, UserResponse.class);
    
(2) 分层 DTO 设计

根据场景定义不同的 DTO:

  • 请求 DTO(如 UserCreateRequest):用于接收接口参数。
  • 响应 DTO(如 UserResponse):用于返回接口数据。
  • 内部 DTO:用于服务间通信(如微服务调用)。
(3) 数据校验

在 DTO 中使用 javax.validation 注解校验数据:

public class UserCreateRequest {@NotBlank(message = "姓名不能为空")@Size(min = 2, max = 20)private String name;@Email(message = "邮箱格式错误")private String email;
}
(4) 避免循环依赖

当 DTO 包含嵌套对象时,需防止无限递归:

public class OrderResponse {private Long id;private UserResponse user;  // UserResponse 中不应反向引用 OrderResponse
}

5. 常见问题

(1) 为什么不用 Entity 直接作为接口参数/返回值?
  • 暴露敏感字段:如返回 User 实体的 password 字段。
  • 数据结构耦合:数据库表结构变化会直接影响接口,破坏兼容性。
  • 性能问题:实体类可能包含大量无用字段,增加网络开销。
(2) DTO 和 VO(Value Object)的区别?
  • DTO:强调数据传输,可能包含业务逻辑无关的字段。
  • VO:强调业务含义,通常用于业务层内部传递数据(但实际开发中二者常混用)。
(3) 如何处理复杂嵌套结构?

使用工具(如 MapStruct)定义嵌套映射:

@Mapper
public interface OrderMapper {OrderResponse toResponse(Order order);default UserResponse toUserResponse(User user) {return UserMapper.INSTANCE.toResponse(user);}
}

6. 总结

设计要点说明
职责分离DTO 仅负责数据传输,不包含业务逻辑。
字段精简仅暴露必要字段,避免冗余。
校验前置在 DTO 层完成数据校验,避免非法数据进入业务逻辑。
工具辅助使用 MapStruct 或 ModelMapper 简化 Entity 和 DTO 的转换。
版本管理独立管理 DTO 的变更,确保接口兼容性。

通过合理使用 DTO 层,可以提升代码的可维护性、接口的安全性和系统的扩展性,是 Spring Boot 开发中的关键实践。

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

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

相关文章

安装docker,在docker上安装mysql,docker上安装nginx

目录 一.安装docker 1.1查看Linux版本的命令这里推荐两种: 1.2查看内核版本有三种方式: 2.安装 2.1 如果之前安装了docker,先删除旧版本的doker 2.2 安装需要的软件包,yum-util提供yum-config-manager功能,另外两…

Android killPackageProcessesLSP 源码分析

该方法用于终止指定包名/用户ID/应用ID下符合条件的应用进程,涉及多进程管理、资源冻结、进程清理及优先级更新等操作。核心流程分为进程筛选、资源冻结、进程终止与资源恢复三个阶段。 /*** 从已排序的进程列表中,提取从指定起始索引 startIdx 开始的连…

openAICEO山姆奥特曼未来预测雄文之三个观察

《三个观察》 山姆奥特曼 这篇文章主要讲的是关于AGI(人工通用智能)的未来发展及其对社会的影响,用大白话总结如下: 核心观点: AGI是什么? AGI是一种能像人类一样解决各种复杂问题的智能系统,比…

部署yolo到k230教程

训练:K230 借助 AICube部署AI 视觉模型 YOLO等教程_嘉楠 ai cube多标签分类-CSDN博客K230模型训练ai cube报错生成部署文件异常_aicube部署模型显示生成部署文件异常-CSDN博客 部署: # 导入必要的库和模块 import os import ujson # 超快的JS…

Flask 应用封装成 Docker 服务的完整技术指南

一、实现原理 容器化核心逻辑 Docker 通过将应用代码、运行环境和依赖项打包成镜像,实现环境一致性。Flask 应用容器化需包含: Python 基础运行环境项目代码及依赖库(requirements.txt)WSGI服务器(如 Gunicorn&#xf…

windows上的 Vmware Workstation 环境搭建

本文的视频版本:https://www.bilibili.com/video/BV1JhLRzyESh Vmware Workstation 是一款跨平台的桌面级虚拟化软件,可以使用 Vmware 创建虚拟机,我们一般使用 Linux 虚拟机(目前主流的 Linux 发行版是 Ubuntu)&…

Linux下终端命令行安装常见字体示例

一、准备工作: 准备好要安装的字体文件,如宋体、微软雅黑(simsun.ttc、msyh.ttc)。进入字体路径: /usr/share/fonts,使用root权限,新建一个目录shell_fonts。 二、命令行安装字体: 将要安装…

CentOS中在线安装Docker(超详细)

1)检查安装docker的基本要求: 64位CPU架构的计算机,目前不支持32为CPU架构的计算机 系统的Linux内核版本为3.10及以上 开启CGroups和namespace功能 2)使用命令查看当前系统的内核版本 [rootlocalhost ~]# uname -r 3.10.0-862…

武汉昊衡科技OLI光纤微裂纹检测仪:高密度光器件的精准守护者

随着AI技术应用越来越广,算力需求激增,光通信系统正加速向小型化、高密度、多通道方向演进。硅光芯片、高速光模块等核心器件内部的光纤通道数量成倍增加,波导结构愈发精细,传统检测手段因分辨率不足、效率低下,难以精…

Java数据结构——Stack

Stack 栈的概念和使用栈的概念栈的使用 栈的应用出栈元素序列有效的括号栈的压入、弹出序列逆波兰表达式最小栈 栈的概念和使用 栈的概念 栈(Stack):一种特殊的线性表,只允许再栈的一端进行插入和删除元素,这一端点被称为栈顶,另…

神经网络与计算机视觉

2016 年,随着 AlphaGo 在围棋比赛中击败李世石,“人工智能”、“神经网络”、“深度 学习”等字眼便越来越多的出现在大众眼前,智能化好像成为一种不可逆转的趋势,带给大家新奇感的同时也带来了一丝忧惧:在不远的未来,机器是否真的拥有思维和情感?《终结者》中天网大战人…

VS2019 与gitcode团队管理

1、安装git 点击下一步安装即可 2、vs2019连接gitcode 然后更改本地的代码添加文件等都可以进行远程同步操作了

Python类和对象四(十三)

魔法方法: 按位运算 按位于运算 只要相同才是1 或运算: 只要某个位是1结果就是1 、 按位非 将结果取反 按位异或: 左移和右移运算符: 右移两位 右移动n位,就是除以2的n次方 左移两位: 左移n位就是乘…

如何设置极狐GitLab 议题截止日?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 截止日期 (BASIC ALL) 可以在议题中使用截止日期,来跟踪截止日期并确保功能按时交付。用户至少需要报告者权限才…

如何在 Conda 环境中降级 Python 版本:详细指南

如何在 Conda 环境中降级 Python 版本:详细指南 Python 版本的管理在开发过程中至关重要,特别是在处理不同项目需求时。对于使用 Conda 环境的 Python 程序员来说,版本管理不仅仅是安装不同的 Python 版本,还涉及到依赖关系的兼容…

【随笔】地理探测器原理与运用

文章目录 一、作者与下载1.1 软件作者1.2 软件下载 二、原理简述2.1 空间分异性与地理探测器的提出2.2 地理探测器的数学模型2.21 分异及因子探测2.22 交互作用探测2.23 风险区与生态探测 三、使用:excel 一、作者与下载 1.1 软件作者 作者: DOI: 10.…

使用达梦官方管理工具SQLark快速生成数据库ER图并导出

在数据库设计与开发中,实体-关系图(ER 图)作为数据建模的核心工具,能够直观呈现表结构、字段属性及表间关系,是团队沟通和文档维护的重要工具。然而,对于许多使用达梦数据库的开发者来说,可用的…

单精度浮点运算/定点运算下 MATLAB (VS) VIVADO

VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比 MATLAB定点运算仿真,对比VIVADO计算的结果 目录 前言 一、VIVADO与MATLAB单精度浮点数运算结果对比 二、MATLAB定点运算仿真 总结 前言 本文介绍了怎么在MATLAB中使用单精度浮点数进行运算…

力扣-141.环形链表

题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。 class Solution { public:bool hasCycle(ListNode *head) {ListNode *fast head;ListNode *slow head;while (fast! n…

RESTful学习笔记(一)

Web发展 一、API 程序硬件接口(Application Programming Interface),是预先定义好的逻辑函数,软件系统不同组成部分衔接的约定,直接调用函数,无序访问代码细节,分为SDK和Web应用接口两类 SDK…