java中的VO、DAO、BO、PO、DO、DTO

VO、DAO、BO 等對象

在了解這里 po、vo、dao、之前先介紹下 MVC 開發模式

  • M層負責與數據庫打交道;
  • C層負責業務邏輯的編寫;
  • V層負責給用戶展示(針對于前后端不分離的項目,不分離項目那種編寫模版的方式,理解V的概念更直觀)。

而VO,BO,PO,DO,DTO呢,就是穿梭在這M、V、C層之間的實體傳輸對象

阿里巴巴規范手冊關于VO,BO,PO,DO,DTO這些的描述

分層領域模型規約:

  • DO(Data Object):此對象與數據庫表結構一一對應,通過 DAO 層向上傳輸數據源對象。
  • DTO(Data Transfer Object):數據傳輸對象,Service 或 Manager 向外傳輸的對象。
  • BO(Business Object):業務對象,由 Service 層輸出的封裝業務邏輯的對象。
  • AO(ApplicationObject):應用對象,在Web層與Service層之間抽象的復用對象模型,極為貼近展示層,復用度不高。
  • VO(View Object):顯示層對象,通常是 Web 向模板渲染引擎層傳輸的對象。
  • Query:數據查詢對象,各層接收上層的查詢請求。注意超過 2 個參數的查詢封裝,禁止使用 Map 類來傳輸。

領域模型命名規約:

  • 數據對象:xxxDO,xxx即為數據表名
  • 數據傳輸對象:xxxDTO,xxx為業務領域相關的名稱。
  • 展示對象:xxxVO,xxx一般為網頁名稱。
  • POJO是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO。

Pojo 和 javabean

POJO是 Plain Old Java Object 的簡寫,大概意思就是“淳樸的Java對象”。這個詞是國外一家外包公司的員工創造的。哪些類是POJO類還是有說法的,需要同時滿足以下幾個條件:

1. 不實現任何接口的類。

2. 不繼承任何其它類的類。

3. 不使用任何外部注解的類。

這種類其實就是切斷了和外界聯系的Java類,下面這個類肯定不是:

@Data
public class Dog {private String name;private Integer age;
}

這個類才是

public class Dog {private String name;private Integer age;
}

Java Bean也經常出現在各種技術文獻中,也不是隨便什么類都能叫做Java Bean的,它需要有以下定義:

● 有無參數構造。

● 所有的屬性必須是私有屬性(private)。

● 所有的屬性必須有公共的(public)的Getter和Setter。

● 它必須是可以被序列化的,也就是實現 java.io.Serializable接口。

按照這個定義,POJO類如果想成為Java Bean,需要改造成下面的形式

import java.io.Serializable;public class Dog implements Serializable {private static final long serialVersionUID = 6723564465081191620L;private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

其實在Spring 中對于 Bean的要求就低多了,只要這個類(接口)被注入了Spring IoC,那么這個類(接口)都可以被稱作一個Spring Bean。所以一個POJO總是孤孤單單的,它不可能成為一個Java Bean或者Spring Bean,但是Java Bean可以同時是一個Spring Bean;Spring Bean也可以是一個Java Bean

項目中真的有必要定義VO,BO,PO,DO,DTO嗎?

還是要理性看待這個問題,要看項目“目的地”是什么。

如果項目比較小,是一個簡單的MVC項目,又是單兵作戰,不建議使用VO,BO,PO,DO,DTO,直接用POJO負責各個層來傳輸就好,因為這種項目的“目的地”是快速完成。

而更多的時候,是持續迭代的團隊協作項目,這個時候就建議用VO,BO,PO,DO,DTO,而且團隊內要達成共識,形成一個標準規范。

不管用哪種方式,只要團隊內定義好一種適應的協同規范就行。沒有一個絕對好與絕對壞的方式方法,團隊規范的盡頭能提升項目的可擴展性、可維護性與可閱讀性,從而降低bug率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95080.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

More Effective C++ 條款16:牢記80-20準則(Remember the 80-20 Rule)

More Effective C 條款16:牢記80-20準則(Remember the 80-20 Rule)核心思想:軟件性能優化遵循帕累托原則(Pareto Principle),即大約80%的性能提升來自于優化20%的關鍵代碼。識別并專注于這些關鍵…

Java中對泛型的理解

一、泛型是什么?1. 定義: 泛型允許你在定義類、接口或方法時使用類型參數(Type Parameter)。在使用時(如聲明變量、創建實例時),再用具體的類型實參(Type Argument) 替換…

Redis開發06:使用stackexchange.redis庫結合WebAPI對redis進行增刪改查

一、接口寫法namespace WebApplication1.Controllers.Redis {[ApiController][Route("/api/[controller]")]public class RedisService : IRedisService{private readonly IConnectionMultiplexer _redis;//StackExchange.Redis庫自帶接口public RedisService(IConne…

【前端教程】從零開始學JavaScript交互:7個經典事件處理案例解析

在網頁開發中,交互性是提升用戶體驗的關鍵。JavaScript作為網頁交互的核心語言,通過事件處理機制讓靜態頁面"動"了起來。本文將通過7個經典案例,從簡單到復雜,逐步講解JavaScript事件處理的實現方法和應用場景。 案例1&…

內存模型(Memory Model)是什么?

內存模型(Memory Model)是什么? 內存模型是一個非常深刻且核心的計算機科學概念。 核心摘要 內存模型是一個契約或協議,它精確定義了: 一個線程對共享內存的寫操作,如何以及何時對其他線程可見。 內存操作(讀/寫)可以被重新排序的程度。 它連接了硬件(CPU如何執行指令…

在 MyBatis 中oracle基本數值類型的 JDBC 類型映射

基本數值類型的 JDBC 類型Java 類型JDBC 類型 (jdbcType)說明int / IntegerINTEGER標準整數類型long / LongBIGINT大整數類型short / ShortSMALLINT小整數類型float / FloatFLOAT單精度浮點數double / DoubleDOUBLE雙精度浮點數java.math.BigDecimalDECIMAL高精度小數&#xff…

Spring注解演進與自動裝配原理深度解析:從歷史發展到自定義Starter實踐

目錄 Spring注解發展史 Spring 1.X Spring 2.X Spring 2.5之前 Required Repository Aspect Spring2.5 之后 Spring 3.x ComponentScan Import 靜態導入 ImportSelector ImportBeanDefinitionRegistrar EnableXXX Spring 4.x Spring 5.x 什么是SPI 自動裝配…

第三屆機械工程與先進制造智能化技術研討會(MEAMIT2025)

【重要信息】 大會官網:https://www.yanfajia.com/action/p/BYE27DYDhttps://www.yanfajia.com/action/p/BYE27DYD 會議地點:哈爾濱理工大學 論文檢索:EI Compendex、Scopus 還有部份版面,欲投稿從速,即將提交出版…

筆記本電腦頻繁出現 vcomp140.dll丟失怎么辦?結合移動設備特性,提供適配性強的修復方案

對于需要用電腦處理工作的人來說,“vcomp140.dll 丟失” 導致程序頻繁閃退,無疑會嚴重影響工作效率。嘗試重啟電腦、重新安裝軟件后,問題依然存在,這時候該怎么辦?別著急,vcomp140.dll 丟失看似棘手&#x…

微動開關-電競鼠標核心!5000萬次壽命微動開關評測

一、主流電競微動開關技術對比?光磁微動技術?采用非接觸式光學觸發原理理論壽命突破5000萬次觸發響應速度0.2ms??傳統機械微動?歐姆龍D2FC-F-7N系列5000萬次標稱壽命機械結構簡單可靠??創新結構微動?雙飛燕漆藍熒光微動特殊涂層提升耐久性手感反饋獨特?二、5000萬次壽…

Go語言與Docker 開發的核心應用領域

1. 容器化應用構建與部署??輕量化鏡像構建Go 語言編譯生成靜態二進制文件,結合多階段構建的 Dockerfile,可大幅縮小鏡像體積(例如使用 scratch 或 alpine 基礎鏡像),提升部署效率?。示例 Dockerfile 片段&#xff1…

【ESP32-IDF】網絡連接開發2:Wi?Fi 智能配網(SmartConfig)

系列文章目錄 持續更新… 文章目錄系列文章目錄前言一、Wi?Fi 智能配網概述1.SmartConfig 簡介2.SmartConfig 工作原理3.SmartConfig 協議類型二、Wi?Fi 智能配網類型定義及相關API三、Wi?Fi 智能配網示例程序總結前言 在物聯網設備開發過程中,如果將 Wi-Fi 的…

CVPR深度學習研究指南:特征提取模塊仍是論文創新難點

關注gongzhonghao【CVPR頂會精選】在深度學習賽道里,別只盯著堆模型卷參數了。最近不少高分工作都在打“可解釋”這張牌,把原本難以理解的黑箱模型用輕量方法剖開,既能增強學術價值,還能拓展落地場景。更妙的是,這類研…

redis----list詳解

列表(List)相當于數組或者順序表一、通用命令LPUSH key value1 [value2 ...]在列表 key 的左側(頭部)插入一個或多個值。示例:LPUSH fruits apple banana → 列表變為 [banana, apple]LPUSHX 只有列表已存在時才會執行…

【python】相機輸出圖片時保留時間戳數據

有時候需要參考時間戳,寫個筆記記錄下 但是輸出時間可能不穩,有待進一步優化 import cv2 import time import os# 創建一個保存圖像的文件夾 output_folder "camera_images" if not os.path.exists(output_folder):os.makedirs(output_folder…

(Nginx)基于Nginx+PHP 驅動 Web 應用(上):配置文件與虛擬主機篇

1.應用場景 主要用于學習基于 Nginx PHP 驅動 Web 應用(上): 配置文件與虛擬主機篇,學習弄清楚Nginx的常規操作,之前困惑的地方。 本文主要介紹了基于NginxPHP驅動Web應用的配置方法,重點講解了Nginx配置…

【golang長途旅行第34站】網絡編程

網絡編程 基本介紹核心主題:?? Golang面向大規模后端服務程序的設計目標中,網絡通信是必不可少且至關重要的部分。?兩種網絡編程方式:???TCP Socket編程? ?性質:網絡編程的主流 ?底層協議:基于TCP/IP協議 ?舉…

Hadoop(六)

目錄:1.Hadoop概述2.為什么需要分布式存儲3.分布式的基礎架構分析4.HDFS的基礎架構1.Hadoop概述2.為什么需要分布式存儲3.分布式的基礎架構分析4.HDFS的基礎架構

Oracle 12g安裝

1. 下載地址 官方網站 一般這種導向的進入的都是oracle的官方網站(先登錄,如果沒有就創建賬號),并沒有真實的12g供你下載。需要你轉入Oracle的云中下載:https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 。我選擇的是12.1.0.2.0下…

ros2--service/服務--接口

獲取service名稱const char *get_service_name() const;std::string client_name client_->get_service_name();RCLCPP_INFO(this->get_logger(), "Client name: %s", client_name.c_str());