entity dto vo
DTO、VO 超通俗大白话讲解
这俩就是Java后台开发里专门分工、分层用的普通实体类,本质都是Java Bean,只是用途和出场位置完全不一样。
一、先一句话秒懂区别
名词 全称 核心作用 谁和谁之间传数据
DTO Data Transfer Object(数据传输对象) 后端内部、服务之间/接口收发 数据库/Service ↔ Controller
VO View Object(视图展示对象) 专门给前端/页面看的数据 Controller ↔ 前端页面/客户端
二、逐个拆开讲+和你现在工具的关系
1. DTO(最常用,你天天在用)
- 定位:中转搬运工
- 场景:
1. 数据库查出来的是 Entity (和数据库表一一对应)
2. 不能直接把Entity往外丢,太危险(密码、敏感字段会泄露)
3. 把Entity需要的字段,拷贝到DTO里,在后端各个层、接口之间传递
- 特点:
- 只存业务必要数据,干净精简
- 不包含页面展示专属字段
- 正好适配你写的 BeanUtilz.cp() 、 copyProperties
日常高频操作: cp(dto, entity) 一行完成Entity→DTO转换
举例子
数据库UserEntity:id、账号、密码、姓名、手机号、创建时间
UserDTO:只保留账号、姓名、手机号,剔除密码,安全传给上层逻辑/接口。
2. VO(给前端最终看的)
- 定位:页面专属模特
- 场景:
1. 要返回给前端、APP、页面展示的数据
2. 字段完全按照前端需求定制,想怎么展示就怎么改
- 特点:
- 可以加很多页面专属字段(比如「状态中文文案、格式化日期、拼接展示名」)
- 字段命名、格式完全迁就前端
- 绝对不碰数据库底层字段
- 操作流程:DTO → VO,再把VO返回给前端
举例子
UserVO:姓名、展示用完整生日、拼接好的地址、状态文案「已启用/已禁用」,专门用来渲染页面。
三、完整分层流转链路(一看就懂)
plaintext
数据库表 → Entity实体类
↓ 【用你BeanUtilz.cp拷贝】
Service层 → DTO(后端内部流转、安全脱敏)
↓ 【再次属性拷贝】
Controller → VO(专门包装、适配前端)
↓
前端页面展示
四、为什么不直接用一个类?分层的意义
1. 安全隔离:Entity不能直接暴露给前端,防止敏
感字段泄露
2. 解耦:数据库改字段,DTO/VO可以不动,前端完全无感知
3. 各司其职:
- Entity:只忠诚对应数据库表
- DTO:只负责后端数据搬运
- VO:只对前端展示友好
4. 方便复用:一套通用拷贝工具(就是你现在的 BeanUtilz )全项目到处复用
五、和你现在工具的完美配合
你的 BeanUtilz 就是专门干这个分层拷贝的:
1. cp(userDto, userEntity) :Entity → DTO
2. cp(userVo, userDto) :DTO → VO
3. toJson(vo) :快速打印VO完整JSON,调试接口、看返回结构超方便
补充:其他容易混淆的名词
- BO:Business Object 业务层对象(日系老项目偶尔用)
- POJO:最普通的无规则Java实体,上面这些本质都属于POJO
要不要我结合你当前的项目,给你写一套 Entity→DTO→VO 的完整代码示例,直接就能跑、对照着彻底练手?
