form表达和实体类通常有什么不同
在 Java 开发(特别是 Spring Boot + 前后端分离 的场景)里,Form
和 实体类(Entity/DO)
看起来很像,都是一堆字段,但它们的职责和使用场景完全不同。
1. Form(表单对象)
位置:通常放在
controller/form
包下。作用:接收前端传来的请求参数。
特点:
只包含和前端交互需要的字段。
通常带有校验注解(
@NotNull
,@Min
,@Email
等)。不一定和数据库表一一对应。
有时会是 前端表单的简化版。
🔹 示例:
@Data public class RegisterForm { @NotNull(message = "用户名不能为空") private String username; @NotNull(message = "密码不能为空") private String password; private String email; // 前端可能传,也可能不传 }
2. 实体类(Entity / DO, Data Object)
位置:通常放在
dao/entity
或domain
包下。作用:对应数据库中的表,用于 ORM 框架(MyBatis、JPA 等)的持久化操作。
特点:
字段通常和数据库表的字段 一一对应。
可能包含数据库自动生成的主键(
id
)、时间戳(createTime
)、逻辑删除标志(deleted
)等。不直接暴露给前端。
🔹 示例:
@Data public class UserEntity { private Long id; // 主键 private String username; private String password; private String email; private LocalDateTime createTime; private LocalDateTime updateTime; private Boolean deleted; // 逻辑删除 }
3. 区别总结
对比点 | Form(表单对象) | 实体类(Entity/DO) |
---|---|---|
来源 | 前端提交的数据 | 数据库表结构 |
字段 | 前端需要什么就定义什么 | 与数据库字段保持一致 |
注解 | 常用 @NotNull , @Min 等校验注解 |
常用 @TableName , @Column , @Id (JPA/MyBatis) |
作用 | 参数接收、校验 | 数据存储、ORM映射 |
是否一一对应数据库表 | ❌ 不一定 | ✅ 通常一一对应 |
4. 为什么要分开?
安全性:表单对象不一定包含敏感字段(例如密码加密后的值、数据库内部 ID)。
灵活性:前端需要的字段和数据库结构可能不一致,Form 可以裁剪/组合。
职责清晰:Controller 负责接收请求(Form),Service/DAO 负责存取数据库(Entity)。
👉 举个小例子:
前端注册时提交:
{ "username": "zhangsan", "password": "123456", "email": "zs@test.com" }
后端
RegisterForm
接收并校验数据。Service 层把
RegisterForm
转换成UserEntity
,补充 UUID、创建时间等。DAO 层用
UserEntity
操作数据库。