Spring Boot 企业级分层中,User 为什么不再用 entity?(一文讲透 DO / Model / DTO)

张开发
2026/5/19 10:11:30 15 分钟阅读
Spring Boot 企业级分层中,User 为什么不再用 entity?(一文讲透 DO / Model / DTO)
一、前言很多人在刚学 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. 领域对象UserModel路径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数据库存储数据库UserModel业务逻辑领域DTO / Response接口传输前端六、为什么必须拆如果你只用一个 entity会出现这些问题❌ 问题1字段污染数据库字段password create_time但前端不应该看到 password ❌❌ 问题2业务逻辑混乱User user new User();你会搞不清这个 user 是数据库对象 还是业务对象 还是接口对象❌ 问题3扩展困难一旦业务复杂状态流转权限控制多表关联 一个 entity 根本扛不住。七、正确的分层流转非常关键前端请求 ↓ CreateUserRequestDTO ↓ 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 跑通查询接口含全部踩坑》带你真正把数据库链路跑通。

更多文章