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

    你可能感兴趣的文章
    Python:函数使用
    查看>>
    Python:函数进阶
    查看>>
    Python:在整数的二进制表示中查找最长的二进制间隙
    查看>>
    Python:如何从二进制转换为 base 64 并返回?
    查看>>
    Python:如何以非阻塞方式读取子进程的标准输出
    查看>>
    Python:如何使用 plotly 制作阴影区域或交替背景颜色?
    查看>>
    Python:如何根据日期时间获取值的计数
    查看>>
    python:如何检测串行 COM 上的设备名称/ID
    查看>>
    Python:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>