一、前言
很多人在刚学 Spring Boot + MyBatis 时,都会这样写:
entity/User.java一个User类解决所有问题:
- 数据库映射 ✔
- 业务逻辑 ✔
- 接口返回 ✔
👉 简单、直接、好用。
但当你接触到企业级项目结构时,就会发现:
domain/model/User.java infrastructure/persistence/dataobject/UserDO.java dto/request/CreateUserRequest.java dto/response/UserResponse.java甚至还有:
assembler/UserAssembler.java这时候就会产生一个疑问:
❓ 为什么不直接用一个 entity?
❓ 为什么要搞这么多 User?
这篇文章,就带你彻底讲清楚。
二、核心结论(先记住)
❗ 小项目:可以用 entity 一把梭
❗ 企业项目:必须拆分对象职责(DO / Model / DTO)
三、为什么 entity 在大项目里不够用?
在简单项目中:
User.java = 数据库表 + 业务对象 + 返回对象但问题是:
👉 这三件事其实是完全不同的职责
四、一个 User,在企业级项目中的三种身份
🟦 1. 数据库对象:UserDO
路径:
infrastructure/persistence/dataobject/UserDO.java作用:
✔ 对应数据库表结构 ✔ 用于 MyBatis 映射示例:
@Data public class UserDO { private Long id; private String username; private String password; private LocalDateTime createTime; }👉 关注点:
字段怎么存🟩 2. 领域对象:User(Model)
路径:
domain/model/User.java作用:
✔ 表达业务语义 ✔ 承载业务规则示例(简化):
public class User { private Long id; private String username; public void validateRegister() { if (username == null || username.isEmpty()) { throw new RuntimeException("用户名不能为空"); } } }👉 关注点:
业务规则怎么定义🟨 3. 接口对象:DTO / Response
路径:
dto/request/CreateUserRequest.java dto/response/UserResponse.java作用:
✔ 接收前端参数 ✔ 返回前端数据示例:
@Data public class UserResponse { private Long id; private String username; }👉 关注点:
前端需要什么字段五、三种对象的本质区别
| 类型 | 作用 | 面向谁 |
|---|---|---|
| UserDO | 数据库存储 | 数据库 |
| User(Model) | 业务逻辑 | 领域 |
| DTO / Response | 接口传输 | 前端 |
六、为什么必须拆?
如果你只用一个 entity,会出现这些问题:
❌ 问题1:字段污染
数据库字段:
password create_time但前端:
不应该看到 password ❌❌ 问题2:业务逻辑混乱
User user = new User();你会搞不清:
这个 user 是数据库对象? 还是业务对象? 还是接口对象?❌ 问题3:扩展困难
一旦业务复杂:
- 状态流转
- 权限控制
- 多表关联
👉 一个 entity 根本扛不住。
七、正确的分层流转(非常关键)
前端请求 ↓ CreateUserRequest(DTO) ↓ CreateUserCommand ↓ User(领域对象) ↓ UserDO(持久化对象) ↓ 数据库 ↓ UserDO ↓ User(领域对象) ↓ UserResponse(返回)👉 这就是企业级项目的标准流转。
八、Assembler 的作用
assembler/UserAssembler.java作用:
✔ 对象转换比如:
UserDO → User User → UserResponse👉 这样可以做到:
各层完全解耦九、那 entity 还用不用?
结论:
🟢 小项目(你现在)
entity/User.java ✔👉 快速开发 ✔
👉 简单直接 ✔
🔴 企业项目
❌ 不再使用统一 entity👉 改用:
model + DO + DTO十、一句话总结
❗ entity 是“混合体”,适合简单项目
❗ 分层模型是“职责拆分”,适合复杂系统
十一、你现在该怎么选?
👉 如果你现在目标是:
学习后端 / 快速做项目用:
entity👉 如果你目标是:
企业级架构 / 高级开发用:
model + DO + DTO十二、最后
很多人一开始会觉得:
这也太复杂了吧?但当你做过复杂业务后就会发现:
❗ 复杂的不是代码,而是业务
❗ 分层只是把复杂性拆开
十三、下一篇预告
👉 《Spring Boot + MyBatis 从 0 到 1 跑通查询接口(含全部踩坑)》
带你真正把数据库链路跑通。