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

从零开始掌握DAO、DTO、DO等模型对象:开发中的核心概念解析

1. 为什么需要这么多对象模型刚入行的时候我也被各种O搞晕过。DAO、DTO、DO、VO...这些看起来差不多的缩写到底有什么区别为什么不能用一个对象搞定所有事情直到有次在项目里把所有数据都用Map传递结果被同事吐槽这代码半年后你自己都看不懂才意识到对象模型的重要性。想象你搬家时的场景搬家师傅用纸箱装物品DAO物流车运输时用标准托盘DTO搬进新家后要拆箱整理DO最后把物品摆放在合适位置VO。每个环节都有最适合的容器混用会导致效率低下甚至物品损坏。代码中的对象模型也是同样的道理。2. 基础模型三剑客DAO、DTO、DO2.1 DAO数据库的专属接口DAOData Access Object就像你家的专属管家。当你想从仓库数据库取东西时不需要自己爬梯子翻货架只要告诉管家帮我拿客厅的那幅画管家会处理好所有底层操作。public interface UserDao { UserDO getById(Long id); // 按ID查询 ListUserDO listByAge(int age); // 条件查询 int insert(UserDO user); // 插入数据 int update(UserDO user); // 更新数据 }实际项目中MyBatis的Mapper接口就是典型的DAO实现。我习惯给所有DAO方法添加Transactional注解确保数据库操作的原子性。曾经有个支付系统因为漏加这个注解导致并发时出现数据错乱。2.2 DTO数据运输的集装箱DTOData Transfer Object是系统间传输数据的标准集装箱。它最大的特点就是单纯——只有属性和getter/setter没有任何业务逻辑。就像快递包裹上的面单只记录物品信息不关心运输过程。public class UserDTO { private String username; private String avatarUrl; // 只有getter/setter }在微服务架构中DTO特别重要。我们团队曾因为直接传递数据库实体导致接口变更引发连锁反应。后来强制规定所有跨服务调用必须通过DTO接口稳定性提高了70%。2.3 DO业务领域的灵魂DODomain Object是业务逻辑的核心载体。与DTO不同DO包含丰富的业务行为。比如用户修改密码场景public class UserDO { private String password; public void changePassword(String oldPwd, String newPwd) { if(!this.password.equals(hash(oldPwd))) { throw new BusinessException(旧密码错误); } this.password hash(newPwd); } }这里有个经验之谈DO的方法应该聚焦单一业务动作。曾经见过一个2000行的UserDO包含了积分、订单、地址等各种逻辑维护起来简直是噩梦。3. 展示层专用模型VO与View3.1 VO前端的数据菜单VOView Object就像为前端定制的数据套餐。后端经常需要把多个DO组合成前端需要的结构public class UserProfileVO { private UserBasicVO basic; private ListOrderSimpleVO orders; private MemberLevelVO level; }在电商项目中商品详情页的VO可能包含商品基本信息、SKU列表、促销信息、评价统计等来自不同领域的数据。我习惯用Builder模式构造复杂VOProductVO vo ProductVO.builder() .basic(productDO.toBasicVO()) .skus(skuService.listByProduct(id)) .build();3.2 ViewMVC中的页面指挥官在MVC架构中View决定页面如何展示数据。以Thymeleaf模板为例div th:if${user.vip} img src/assets/vip-badge.png /div实际开发中容易犯的错误是把业务逻辑写在View里。记得有次排查bug发现JSP里竟然有金额计算逻辑这种反模式会导致维护困难。4. 其他常见模型解析4.1 POJO与PO最基础的Java对象POJO就是普通的Java对象比如public class User { private String name; // getter/setter }而POPersistent Object特指与数据库表映射的对象。使用MyBatis时常见的场景resultMap iduserMap typeUserPO id columnid propertyid/ result columnuser_name propertyname/ /resultMap4.2 BO与AO业务逻辑的组织者BOBusiness Object是业务流程的协调者。比如下单流程public class OrderBO { public OrderResult createOrder(OrderRequest request) { // 验证库存 // 计算价格 // 创建订单 // 发送通知 } }AOApplication Object更像是跨层数据传输的通用载体。在RPC调用中经常见到public class RpcResultT { private boolean success; private T data; private String errorMsg; }5. 实际项目中的模型转换模型转换是避免不了的但要注意转换时机。推荐在架构边界处进行转换DAO层返回DO给Service层Service层将DO转换为DTO给ControllerController将DTO转换为VO给前端使用MapStruct可以简化转换代码Mapper public interface UserConverter { UserConverter INSTANCE Mappers.getMapper(UserConverter.class); UserDTO doToDto(UserDO user); UserVO dtoToVo(UserDTO dto); }曾经有个项目没有规范转换流程导致一个请求中反复转换了7次对象性能下降了40%。后来我们制定了严格的转换规范禁止在循环内转换对象大列表采用批量转换敏感字段在最早可能的环节过滤掉6. 如何设计好的对象模型经过多个项目的实践我总结了这些经验明确职责边界DAO只管数据库访问DTO只管数据传输DO承载业务逻辑保持immutableDTO/VO尽量设计成不可变对象final字段构造器注入版本兼容对外暴露的DTO要考虑向后兼容新增字段不要影响老接口分层校验DTO做基础校验非空、格式DO做业务校验状态、权限性能考量大对象要懒加载关联数据考虑用ID代替完整对象引用在最近的一个微服务项目中我们通过规范对象模型设计使接口平均响应时间降低了30%而且代码的可读性大幅提升。新同事上手时只要看对象模型的定义就能理解业务场景。

相关文章:

从零开始掌握DAO、DTO、DO等模型对象:开发中的核心概念解析

1. 为什么需要这么多对象模型? 刚入行的时候,我也被各种O搞晕过。DAO、DTO、DO、VO...这些看起来差不多的缩写,到底有什么区别?为什么不能用一个对象搞定所有事情?直到有次在项目里把所有数据都用Map传递,结…...

多组学联合分析揭示转录因子调控网络:ATAC-seq与RNA-seq的协同应用

1. 多组学联合分析的技术基础 在基因组学研究领域,ATAC-seq和RNA-seq已经成为揭示基因调控网络的两大核心技术。ATAC-seq全称是转座酶可及性染色质测序,它能够精准定位基因组中开放的染色质区域。想象一下,DNA就像一条紧密缠绕的毛线&#xf…...

基恩士KV系列轴控制FB模板库:全方位功能支持,详细文档助你轻松编程

基恩士KV7500,KV8000轴控制FB模板,直接可以拿来用,使基恩士编程也随心所欲。 包含了适配5种定位控制单元的FB,像常用的KV-XH16ML、KV-SH04PL等都有适配的FB。 功能上包含了原点返回、绝对定位、相对定位、速度控制、力矩控制、两轴直线插补等…...

OpenClaw本地代理方案:千问3.5-35B-A3B-FP8接口调用加速3种方法

OpenClaw本地代理方案:千问3.5-35B-A3B-FP8接口调用加速3种方法 1. 问题背景与挑战 去年夏天,当我第一次尝试用OpenClaw对接千问3.5-35B-A3B-FP8模型处理图文混合任务时,遇到了令人头疼的延迟问题。一个简单的"分析截图中的文字并生成…...

5KW MPPT控制器-太阳能系统用STM32F103RCT6主控平台

5KW MPPT控制器太阳能控制器 主控平台:STM32F103RCT6 逆变拓扑:BUCK-BOOST 功能:高效率MPPT控制器;支持给200V电池充电;485通讯,在线升级; 描述:本方案为AD格式原理图,PC…...

简化的Penman-Monteith公式变体

vic水文模型 VIC水文模型径流模拟 全程视频教学指导,讲解详细 从基础内容处理讲解到模型参数率定全程教学。 零基础可学。 自用模型,从零到实践,历时两周左右 全套教程最近在折腾VIC水文模型的径流模拟,发现这玩意儿就像搭乐高—…...

十分钟搞定口播智能体:用快马平台快速搭建旗博士原型

最近在做一个口播内容生成工具的原型验证,尝试了用InsCode(快马)平台快速搭建"旗博士"智能体的demo,整个过程比想象中顺畅很多。记录下这个十分钟搞定的开发过程,给需要快速验证AI产品创意的朋友参考。 明确核心功能需求 这个口播智…...

避开这些坑,你的芯片设计才能成功流片:CMOS制造工艺中的关键检查点详解

避开这些坑,你的芯片设计才能成功流片:CMOS制造工艺中的关键检查点详解 在芯片设计领域,流片失败往往意味着数百万美元的损失和数月的开发时间付诸东流。对于初入行的工程师而言,理解制造工艺中的潜在风险点比掌握正向设计流程更为…...

如何在Windows上获得完美的macOS光标体验:完整指南

如何在Windows上获得完美的macOS光标体验:完整指南 【免费下载链接】macOS-cursors-for-Windows Tested in Windows 10 & 11, 4K (125%, 150%, 200%). With 2 versions, 2 types and 3 different sizes! 项目地址: https://gitcode.com/gh_mirrors/ma/macOS-c…...

基于FPGA的机器视觉缺陷检测实现铝片表面四缺陷精准检测:源码及测试文件共享,SSD-Mobi...

基于FPGA机器视觉缺陷检测 实现铝片表面四种缺陷的检测 包含源码和端测文件 使用SSD-MobileNetV1模型,识别精度达到85%以上。在工业检测领域,金属板表面缺陷检测的效率与精度直接影响产品质量管控水平。本文聚焦基于FPGA的机器视觉缺陷检测系统&#xff…...

SPI闪存性能优化实战:用STM32F1的DMA+NM25Q128实现高速数据记录

SPI闪存性能优化实战:用STM32F1的DMANM25Q128实现高速数据记录 在物联网设备数据采集场景中,嵌入式存储性能往往成为系统瓶颈。传统轮询方式操作SPI闪存时,CPU需要全程参与数据传输,导致吞吐量低下且系统资源占用率高。本文将深入…...

Oracle EBS 6+2 段式 COA 架构 拆到最细、可直接落地 EBS 的版本,每一段的作用、限定词、长度、编码规则、为什么这么设计全部讲清楚

把 62 段式 COA 架构 拆到最细、可直接落地 EBS 的版本,每一段的作用、限定词、长度、编码规则、为什么这么设计全部讲清楚,你可以直接拿去做方案文档。一、62 段式架构总定义6 段 法定核算 管理核算的核心骨架(必须固定)2 段 …...

如何用5步告别Mac菜单栏混乱?Ice帮你打造高效工作空间

如何用5步告别Mac菜单栏混乱?Ice帮你打造高效工作空间 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你是否曾因Mac菜单栏上密密麻麻的图标而感到焦虑?随着工作时间的推移&a…...

面试-并行前缀和优化 Linear Attention

1 什么是前缀和? 定义: 第 k 个元素的状态依赖于第 k-1 个元素; 公式: 前缀和 = 从第 1 个,一直加到当前位置; 例子: 比如有 4 个数: A、B、C、D; 那么前缀和的结果为: S1 = A S2 = A + B S3 = A + B + C S4 = A + B + C + D在 Linear Attention 中有所体现,即,…...

Palworld存档工具完全指南:高效管理与转换游戏数据

Palworld存档工具完全指南:高效管理与转换游戏数据 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档工具是一款专为Palwor…...

锐龙处理器终极调优指南:如何用RyzenAdj释放隐藏性能

锐龙处理器终极调优指南:如何用RyzenAdj释放隐藏性能 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj 你是否曾觉得自己的AMD锐龙处理器性能没有完全发挥?或者…...

终极解锁NCM音乐自由:从加密困境到全设备畅听的技术破局指南

终极解锁NCM音乐自由:从加密困境到全设备畅听的技术破局指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾遇到这样的尴尬:精心收藏的网易云音乐下载到本地后,却发现是无法在其他设备播…...

别再乱采了!FOC电流环调试中,低侧、高侧、在线采样到底怎么选?(附STM32避坑指南)

FOC电流采样方案实战指南:从硬件选型到STM32避坑技巧 在无刷电机控制领域,电流采样方案的选择往往决定了整个FOC(磁场定向控制)系统的稳定性和开发效率。作为一名长期奋战在电机控制一线的工程师,我见过太多项目因为采…...

威纶通MT8102iE触摸屏中文用户名显示不全?手把手教你用EasyBuilder Pro V6.09.01.357s搞定

威纶通MT8102iE触摸屏中文用户名显示异常的深度解决方案 在工业自动化控制系统中,人机界面(HMI)作为操作人员与设备交互的重要窗口,其用户体验直接影响着生产效率。威纶通(Weintek)MT8102iE作为一款广泛应用于工业场景的触摸屏,其用户管理功能…...

C++的std--ranges工作窃取算法

C的std::ranges工作窃取算法:高效并行的新利器 在现代多核处理器普及的背景下,如何充分利用计算资源成为编程领域的重要课题。C20引入的std::ranges库不仅简化了范围操作,还通过工作窃取算法(Work-Stealing Algorithm&#xff09…...

手把手教你解决Android中Toast引发的InputDispatcher崩溃问题

深入解析Android中Toast与UI线程冲突导致的InputDispatcher崩溃及解决方案 在Android开发中,Toast作为一种轻量级的提示工具被广泛使用,但许多开发者可能没有意识到,不当使用Toast可能会引发严重的系统级崩溃。特别是当Toast与UI线程操作发生…...

拓朋N86公网车载台:邮政分拣车高效协同的通信保障

在繁忙的邮政包裹分拣中心,效率与协同是每辆分拣车与调度人员最为关心的两大要素。在这样一片高速运转而充满挑战的天地里,拓朋N86公网集群车载台以其出色的性能,悄然成为了分拣车队的隐形指挥中枢。 全国覆盖,沟通无阻 分拣中心往…...

Kubernetes实战:构建高可用Zookeeper集群(3节点)的完整指南

1. 为什么要在Kubernetes上部署Zookeeper集群? Zookeeper作为分布式系统的"大脑",在微服务架构中扮演着关键角色。它负责维护配置信息、命名服务、分布式同步和集群管理等核心功能。传统物理机部署Zookeeper集群时,我们需要手动配置…...

突破单人游戏限制:Nucleus Co-op焕新本地多人游戏体验

突破单人游戏限制:Nucleus Co-op焕新本地多人游戏体验 【免费下载链接】splitscreenme-nucleus Nucleus Co-op is an application that starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/spl…...

从ChatGLM到DeepSeek-V2:我用LLaMA-Factory一站式搞定5种大模型的高效微调

从ChatGLM到DeepSeek-V2:我用LLaMA-Factory一站式搞定5种大模型的高效微调 在开源大模型技术快速迭代的今天,工程师和研究者面临着一个幸福的烦恼:如何在ChatGLM、DeepSeek、Qwen、Yi、LLaMA等不同架构的模型之间高效切换和实验?传…...

跨平台创意工坊下载工具:突破游戏平台限制的开源解决方案

跨平台创意工坊下载工具:突破游戏平台限制的开源解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 当你在Epic Games平台免费领取了《求生之路2》&#xff0c…...

突破限制:旧Mac设备升级最新macOS全流程指南

突破限制:旧Mac设备升级最新macOS全流程指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当您的Mac设备被官方系统升级列表排除在外时&#xf…...

【读书笔记】《反倦怠能量站》

《反倦怠能量战》:从低迷内耗到轻松行动的科学方法核心主张 这本书不是励志鸡汤,不靠鞭策意志力。它的核心是:搭建一个有能量的行动体系——在不需要太多意志力的情况下,让自己保持可持续的工作与生活节律。一、能量是什么&#x…...

Win11Debloat效能革命:Windows系统极限释放的开源优化方案

Win11Debloat效能革命:Windows系统极限释放的开源优化方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...

C++ lambda 捕获机制剖析

C lambda 捕获机制剖析 在现代C编程中,lambda表达式因其简洁性和灵活性成为开发者常用的工具之一。lambda的核心特性之一是其捕获机制,它允许在匿名函数内部访问外部变量。理解捕获机制不仅能提升代码效率,还能避免潜在的内存和逻辑错误。本…...