news 2026/4/17 19:48:40

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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. 领域对象: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 跑通查询接口(含全部踩坑)》

带你真正把数据库链路跑通。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 19:46:33

从内核到芯片:ARM架构与SoC设计的入门指南

1. ARM架构的江湖地位与核心价值 第一次接触ARM这个词时,你可能以为它是个神秘的高科技组织。其实它更像是个"芯片界的麦当劳"——自己不生产汉堡(芯片),但把完美配方(架构设计)授权给各大厂商。…

作者头像 李华
网站建设 2026/4/17 19:46:33

Linux用户管理和权限设置

一 用户与组的管理Linux 中的用户分为三种角色:超级用户、普通用户和程序用户,每个角色有不同的权限和用途。理解这些角色及其对应的权限设置是系统管理的基础。1、用户的三种类型1.1root用户超级管理员,拥有系统的最高权限 UID01.2程序用户用…

作者头像 李华
网站建设 2026/4/17 19:45:31

从“0x7C显示b”说开去:图解单片机GPIO驱动数码管的底层电路与电平逻辑

从“0x7C显示b”说开去:图解单片机GPIO驱动数码管的底层电路与电平逻辑 数码管作为嵌入式系统中最基础的人机交互元件之一,其驱动原理看似简单却蕴含着硬件与软件协同工作的精妙设计。许多初学者能够熟练编写P00x7C这样的代码让数码管显示字母"b&qu…

作者头像 李华
网站建设 2026/4/17 19:44:20

智能超构材料与AI融合:从设计自动化到波域计算的未来蓝图

1. 当超构材料遇见AI:一场物理与算法的双向奔赴 第一次听说"超构材料"这个词时,我正盯着实验室里一块看似普通的金属板发呆。导师告诉我,这块板子能像哈利波特的隐形斗篷一样弯曲光线——当然效果还很初级。十年后的今天&#xff0…

作者头像 李华