博客
关于我
DTO数据传输对象详解
阅读量:537 次
发布时间:2019-03-08

本文共 2275 字,大约阅读时间需要 7 分钟。

数据传输对象(DTO)分析与应用实例

什么是DTO?

数据传输对象(DTO,Data Transfer Object)是一种在面向服务架构(SOA)设计中用于数据传输的设计模式。其核心作用是为了在分布式系统中实现客户端和服务端之间的数据传输,避免直接将敏感数据传递至业务逻辑层。

简单来说,假设你有一个 User 实体类,包含用户的基本信息(如用户名、密码、邮箱、手机号等);当用户登录时,通常只需要提供用户名和密码。服务端可以将这些传入的数据通过 LoginDto 实体类进行封装,从而避免直接将敏感数据传递至服务层。


DTO解决了什么问题?

DTO 模式解决了以下几个关键问题:

  • 客户端与服务器端之间的数据不一致问题:通过DTO将数据结构化,确保客户端和服务器端对数据的理解保持一致。
  • 服务单一化接口的问题:避免在接口中直接传输实体类,导致接口泛滥。
  • 数据传输量过大问题:通过对数据进行结构化和筛选,减少数据传输的开销。
  • 数据传输作用域过大的问题:将只需要传输的部分数据提取出来,减少跨层次的数据泄露。

  • 代码案例解析

    服务层接口

    @RestControllerpublic class AccountController {        @Autowired    private UserService userService;        @Autowired    private JwtUtil jwtUtil;        @PostMapping("/login")    public Result login(@Validated @RequestBody LoginDto loginDto, HttpServletResponse response) {        // 通过loginDto获取用户信息        User user = userService.getOne(new QueryWrapper
    ().eq("username", loginDto.getUsername())); if (!user.getPassword().equals(SecureUtil.md5(loginDto.getPassword()))) { return Result.fail("密码不正确!"); } String jwt = jwtUtil.generateToken(user.getId()); response.setHeader("Authorization", jwt); response.setHeader("Access-Control-Expost-Headers", "Authorization"); return Result.success(MapUtil.builder().put("id", user.getId())); }}

    DTO 实体类

    @Datapublic class LoginDto implements Serializable {        @NotBlank(message = "用户名不能为空!", name = "username")    private String username;        @NotBlank(message = "密码不能为空!", name = "password")    private String password;}

    对比 User 实体类

    @Data@Table(name = "m_user")public class User extends BaseEntity {        @TableId(type = IdType.AUTO)    private Long id;        @NotBlank(message = "昵称不能为空~")    private String username;        private String avatar;        @NotBlank(message = "邮箱不能为空~")    @Email(message = "邮箱格式不正确~")    private String email;        private String password;        private Integer status;        private LocalDateTime created;    private LocalDateTime lastLogin;}

    优点解读

  • 数据隔离:DTO 实体类仅包含需要传输的字段,避免了不必要的数据传输。
  • 安全性:通过数据转换层(如LoginDto)将敏感数据与业务逻辑层解耦,降低了数据泄露风险。
  • 高效性:通过对数据进行校验和转换,减少了业务逻辑层的负载压力。

  • DTO 在实际开发中的应用场景

  • 数据传输:将前端传递的数据结构化为DTO格式,接收后再转换为业务对象。
  • 数据验证:在数据传输过程中对 DTO 进行参数校验,确保数据完整性。
  • 接口统一规范:定义统一的 DTO 接口,避免接口冗余,提升系统设计质量。

  • 通过以上实例可以看出,DTO 帮助我们在分布式系统中更好地处理数据传输问题,为系统设计和实现提供了更加灵活和安全的解决方案。

    转载地址:http://huyiz.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)
    查看>>
    OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
    查看>>
    OpenCV与AI深度学习 | 实用技巧 | 使用OpenCV进行模糊检测
    查看>>
    OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
    查看>>
    OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>
    OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 水下检测+扩散模型:或成明年CVPR最大惊喜!
    查看>>
    OpenCV与AI深度学习 | 深入浅出了解OCR识别票据原理
    查看>>
    OpenCV与AI深度学习 | 深度学习检测小目标常用方法
    查看>>
    OpenCV与AI深度学习 | 超越YOLOv10/11、RT-DETRv2/3!中科大D-FINE重新定义边界框回归任务
    查看>>
    OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用
    查看>>
    OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    OpenCV中的监督学习
    查看>>
    opencv中读写视频
    查看>>