Entity 和 DTO 的区别

Entity 和 DTO 的区别

1. Entity(实体类)------ 面向数据库

作用 :直接映射数据库表结构,用于数据存储和读取

特点

  • 字段与数据库表列一一对应
  • 包含所有字段(包括密码等敏感信息)
  • 带有 JPA/MyBatis 注解(如 @Table, @Column

举个例子SysUser.java 实体类

java 复制代码
public class SysUser {
    private Long id;           // 用户ID
    private String username;   // 用户名
    private String password;   // 密码(加密存储,敏感!)
    private String email;      // 邮箱
    private Integer status;    // 用户状态
    private String role;       // 用户角色
    private Date createTime;   // 创建时间
    // ...
}

2. DTO(数据传输对象)------ 面向接口

作用 :在不同层之间传输数据(如前端和后端之间)。

特点

  • 只包含需要传输的字段
  • 不直接映射数据库表
  • 用于 API 请求和响应

举个例子LoginDTO.java(登录请求)

java 复制代码
public class LoginDTO {
    private String username;   // 只需要用户名
    private String password;   // 只需要密码
    // 不需要 id、email、status 等字段
}

举个例子LoginResponseDTO.java(登录响应)

java 复制代码
public class LoginResponseDTO {
    private Long id;           // 用户ID
    private String username;   // 用户名
    private String role;       // 用户角色
    private String accessToken;  // Token
    private String refreshToken; // Refresh Token
    // 没有 password!不返回敏感信息
}

为什么需要分开设计

1. 安全性 ------ 保护敏感数据

  • 如果直接用 SysUser 实体返回给前端,密码等敏感信息会泄露
  • DTO 可以选择性地暴露字段,确保安全

2. 解耦 ------ 数据库变化不影响接口

  • 数据库表结构可能会变化(比如加字段、改字段名)
  • API 接口可以保持稳定,不受数据库变化影响

3. 灵活性 ------ 按需组合数据

  • DTO 可以组合多个表的数据
  • 例如:一个订单详情 DTO 可以包含订单信息 + 用户信息 + 商品信息

4. 性能 ------ 减少网络传输

  • 只传输需要的数据,避免传输大量无用字段
  • 提升接口响应速度

实际工作流程

复制代码
前端请求 → LoginDTO(只传用户名密码)
         ↓
后端 Service → SysUser(从数据库查询完整用户信息)
         ↓
后端 Controller → LoginResponseDTO(只返回安全的必要信息)
         ↓
前端接收 → 拿到 id、username、role、token(没有密码)

简单总结

对比维度 Entity DTO
面向对象 数据库表 API 接口
字段范围 全部字段 按需字段
敏感信息 包含(如密码) 不包含
用途 数据存储 数据传输

这样设计是企业级开发的标准做法,既安全又灵活。