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 接口 |
| 字段范围 | 全部字段 | 按需字段 |
| 敏感信息 | 包含(如密码) | 不包含 |
| 用途 | 数据存储 | 数据传输 |
这样设计是企业级开发的标准做法,既安全又灵活。