news 2026/3/2 12:24:42

JAVA 中dao层的实体应该属于哪个层次VO,还是DTO,或者其他

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JAVA 中dao层的实体应该属于哪个层次VO,还是DTO,或者其他

在Java项目中,DAO层的实体通常指的是PO(Persistent Object,持久化对象)​ 或Entity(实体类),而不是DTO或VO。以下是详细解释:


1.PO(持久化对象) / Entity

  • 与数据库表直接映射,通常一个PO对应一张表。

  • 用于DAO层与数据库进行CRUD操作。

  • 一般使用JPA/Hibernate/MyBatis等ORM框架的注解(如@Entity@Table@Column)进行映射。

  • 示例:

    @Entity @Table(name = "user") public class User { @Id private Long id; private String name; // getters & setters }

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

  • 用于层与层之间的数据传输(如Service → Controller,或Controller → 前端)。

  • 目的是封装数据、减少网络调用次数,可能组合多个PO的字段。

  • 示例:

    public class UserDTO { private String name; private String email; // 无数据库映射注解 }

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

  • 用于展示层(如前端页面),根据UI需求定制字段。

  • 可能包含多个DTO/PO的组合、计算字段或格式化数据。

  • 示例:

    public class UserVO { private String displayName; private String avatarUrl; }

4.DAO层的角色

  • DAO层(Data Access Object)负责数据持久化操作(增删改查)。

  • 它的输入/输出通常是PO,因为PO直接对应数据库结构。

  • 在复杂查询时,DAO可能返回自定义对象(非表映射实体),这类对象可视为查询结果对象(Query Result Object),但仍属于PO的变体。


5.最佳实践与常见误区

对象

使用场景

是否用于DAO层?

PO

数据库映射

(主要用途)

DTO

层间数据传输

否(Service/Controller层)

VO

前端展示

否(Controller/View层)

  • 避免在DAO层使用DTO/VO:DAO应专注于持久化操作,不处理业务逻辑或展示逻辑。

  • 对象转换:通常通过工具(如MapStruct、Spring Converter)在PO、DTO、VO之间转换。


6.复杂场景示例

多表关联查询时,DAO层可能返回自定义对象(非严格PO):

// 非表映射的查询结果对象 public class UserOrderSummary { private String userName; private Integer orderCount; // 无@Entity注解 } // DAO接口 public interface UserDao { List<UserOrderSummary> findUserOrderSummary(); }

总结

  • DAO层实体首选PO/Entity,与数据库表结构一致。

  • DTO用于传输VO用于展示,二者不应出现在DAO层。

  • 保持分层清晰,避免对象混用,提高代码可维护性。

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

Flutter 应用保活与后台任务:在 OpenHarmony 上实现定时上报

前言 在 OpenHarmony 生态中&#xff0c;许多应用场景&#xff08;如健康监测、设备状态上报、位置追踪&#xff09;要求应用即使在退到后台或屏幕关闭后&#xff0c;仍能周期性执行任务。然而&#xff0c;出于系统资源与电池优化的考虑&#xff0c;OpenHarmony 对后台进程有严…

作者头像 李华
网站建设 2026/2/25 7:31:09

【RL】verl 数据处理

您的 Eurus-2-RL-Data 数据集需要做两个主要适配&#xff1a;文件格式转换和字段映射配置。 快速解决方案 1. 转换文件格式&#xff08;推荐&#xff09; 将 arrow 文件转换为 parquet 格式&#xff1a; from datasets import load_dataset import os# 加载原始数据 ds lo…

作者头像 李华
网站建设 2026/2/25 3:49:46

Product Hunt 每日热榜 | 2025-12-13

1. Gemini Deep Research Agent 标语&#xff1a;最优秀的研究助手现已向开发者开放&#xff01; 介绍&#xff1a;Gemini深度研究助手现在可以通过互动API提供给开发者使用。它由Gemini 3.0 Pro驱动&#xff0c;能够自主规划、执行和综合多步骤的研究任务。 产品网站&#…

作者头像 李华
网站建设 2026/2/28 10:00:38

Python内置函数:你以为你很熟,但这些用法90%的人不知道

你好&#xff0c;我是你的技术朋友。今天我想和你聊聊那些每天都在用&#xff0c;却可能只用了十分之一功能的Python内置函数。 想象一下&#xff0c;你家厨房有一套顶级厨刀&#xff0c;但平时只用它切切西红柿。直到有天看到大厨用同一把刀雕出一朵萝卜花&#xff0c;你才恍然…

作者头像 李华
网站建设 2026/2/23 18:25:04

python_基于主视频删减片段并插入镜头视频

python_基于主视频删减片段并插入镜头视频 import pyJianYingDraft as draft from pyJianYingDraft import trange, ClipSettings,timdef create_jianying_draft_from_clips(draft_name,main_video_path,delete_ranges,lens_info_dict,draft_folder_path):# 时间格式转换函数(处…

作者头像 李华