博客
关于我
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/

    你可能感兴趣的文章
    PostgreSQL学习总结(5)—— PostgreSQL table 创建与删除
    查看>>
    PostgreSQL学习总结(6)—— PostgreSQL 模式(SCHEMA)详解
    查看>>
    PostgreSQL学习总结(7)—— PostgreSQL 语句 INSERT INTO、SELECT、UPDATE、DELETE 等学习
    查看>>
    PostgreSQL学习总结(8)—— PostgreSQL 基于数据库和基于模式(schema)的多租户分析
    查看>>
    PostgreSQL学习总结(9)—— PostgreSQL 运算符与表达式
    查看>>
    PostGreSql学习笔记001---PostgreSQL10.4安装(Windows)_支持PostGreGis_PostJDBC
    查看>>
    PostGreSql学习笔记002---Navicat Premium中管理PostGreSql 错误:字段rolcatupdate 不存在
    查看>>
    PostgreSQL学习笔记:PostgreSQL vs MySQL
    查看>>
    PostgreSQL实现shape数据转geojson数据(地图工具篇.18)
    查看>>
    PostgreSQL导入shape数据(地图工具篇.10)
    查看>>
    PostGreSql工作笔记003---在Navicat中创建数据库时报错rolcatupdate不存在_具体原因看其他博文_这里使用pgAdmin4创建管理postgre
    查看>>
    PostGreSql工作笔记004---PostGreSql修改密码_windows和linux下修改
    查看>>
    Postgresql常用命令行操作_以及Navicat操作PostGis时的问题_自动截取长度_WKB structure does not match exp---PostgreSQL工作笔记005
    查看>>