当前位置: 首页 > news >正文

Spring学习笔记05——Spring Boot的文件结构2(POJO类)

在Spring Boot项目中,将Entity、DTO、VO放在POJO子模块中是一种常见的分层设计,它们各自承担不同的职责,通过一个通俗的例子来解释它们的作用:

POJO(Plain Old Java Object)是指普通的、简单的Java对象,只有属性和对应的setter和getter方法,不依赖于任何特定的框架、接口或父类。它的核心思想是保持代码的简洁性和可移植性,避免与特定技术绑定。

Entity、DTO、VO 都属于 POJO,它们是具有特定用途的POJO。下面详细讲解。


1. Entity(实体)

  • 作用直接对应数据库表,用于ORM框架(如Hibernate)操作数据库。
  • 特点:字段与数据库表严格一致,可能包含关联关系(如外键)。
  • 示例
    假设有一个用户表user,包含字段:idusernamepasswordemailcreate_time
    对应的Entity类如下:
    @Entity
    @Table(name = "user")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String username;
        private String password;
        private String email;
        private LocalDateTime createTime;
        // Getters and Setters
    }
    

2. DTO(Data Transfer Object,数据传输对象)

  • 作用在层间(如Controller层和Service层)传递数据,屏蔽敏感字段,或适配不同场景的输入。
  • 特点:字段可能与Entity不同,例如排除敏感信息(如密码),或组合多个Entity的字段。
  • 示例
    用户注册时,前端可能只需要提交usernamepasswordemail,不需要idcreate_time
    对应的DTO类如下:
    public class UserDTO {
        private String username;
        private String password;
        private String email;
        // Getters and Setters
    }
    
    使用场景
    • Controller接收到UserDTO后,将其转换为User实体,再交给Service层保存到数据库。
    • 避免了直接暴露Entity结构,提升安全性(例如密码加密后再存储)。

3. VO(View Object,视图对象)

  • 作用返回给前端的展示数据,定制化字段,适配前端需求。
  • 特点:字段可能与Entity差异较大,例如排除敏感信息、格式化时间、组合多个数据源的结果。
  • 示例
    查询用户信息时,前端需要idusernameemail和格式化后的createTime,但不需要password
    对应的VO类如下:
    public class UserVO {
        private Long id;
        private String username;
        private String email;
        private String formattedCreateTime; // 例如:2024-01-01 12:00:00
        // Getters and Setters
    }
    
    使用场景
    • Service层查询到User实体后,将其转换为UserVO,再通过Controller返回给前端。
    • 避免暴露数据库细节,提升接口灵活性。

总结:三者的协作流程

  1. 用户注册
    • 前端提交UserDTO → Controller接收 → Service层将UserDTO转为User实体 → 存入数据库。
  2. 查询用户信息
    • Service层查询User实体 → 转为UserVO → Controller返回UserVO给前端。

备注:主流规范的做法应该是Controller接收到DTO后,在Controller层将DTO转为Entity,再交给Service处理。在一些极简单项目(不严格分层时),也可能会由Service层进行转换。


关键区别

类型用途字段特点生命周期
Entity直接操作数据库与数据库表严格一致持久化层(数据库操作)
DTO层间数据传输(如Controller ↔ Service)可能比Entity少字段,或增加校验逻辑请求处理阶段
VO返回给前端的展示数据定制化字段,适配前端需求响应生成阶段

为什么分层?

  • 安全性:避免将Entity直接暴露给前端(如隐藏密码)。
  • 灵活性:Entity、DTO、VO可独立变化,互不影响(例如数据库字段变更只需调整Entity)。
  • 解耦:各层职责清晰,Controller不依赖数据库结构,Service不依赖前端需求。

相关文章:

  • 基于 PHP 内置类及函数的免杀 WebShell
  • 【MySQL】mysql日志文件
  • OpenCV图像拼接(3)图像拼接类cv::detail::MultiBandBlender
  • 前端学习笔记--CSS
  • 【机器学习】线性回归和逻辑回归的区别在哪?
  • 【零基础JavaScript入门 | Day7】三大交互案例深度解析|从DOM操作到组件化开发
  • Netty——I/O 线程模型
  • 最长连续子序列和的所含元素 -- Kadane算法拓展
  • 【C++网络编程】第8篇:协议设计与序列化(Protobuf、FlatBuffers)
  • 流式ETL配置指南:从MySQL到Elasticsearch的实时数据同步
  • 【设计模式】工厂模式
  • 信息学奥赛一本通 1514:【例 2】最大半连通子图 | 洛谷 P2272 [ZJOI2007] 最大半连通子图
  • vue watch数据监听
  • R语言——字符串
  • RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了,该如何解决?
  • 模型搭建与复现
  • 【Linux网络-多路转接select】
  • Active Directory (AD): 企业网络用户管理的重要性及 AD 迁移方法
  • UNIX网络编程笔记:TCP、UDP、SCTP编程的区别
  • 解决 MySQL 的 sql_mode 中包含 only_full_group_by模式导致group by SQL报错
  • 内容营销怎么做/西安网站优化公司
  • 建设通官方网站下载/谷歌搜索优化
  • 外贸公司网站/网站域名查询官网
  • 开发平台多少钱/北京网站优化推广方案
  • 网推是什么意思/谷歌seo优化推广
  • 湛江电子商务网站建设/2023广东最新疫情