Java开发中PO、VO、DAO、BO、DTO、POJO 含义

news2024/11/29 20:42:49

PO(persistant object) 持久对象

可以看成是与数据库中的表相映射的java对象。使用 Mybatis 来生成 PO 是不错的选择。

VO(value object) 值对象

通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。

PO只能用在数据层,VO用在商业逻辑层和表示层。各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合,便于以后系统的维护和扩展。

DAO(Data Access Objects) 数据访问对象接口

DAO是Data Access Object数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。

J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开。实现DAO模式能够更加专注于编写数据访问代码。

DAO模式是标准的J2EE设计模式之一。开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开。一个典型的DAO实现有下列几个组件:

  1. 一个DAO工厂类;
  2. 一个DAO接口;
  3. 一个实现DAO接口的具体类;
  4. 数据传递对象(有些时候叫做值对象)。

具体的DAO类包含了从特定的数据源访问数据的逻辑。

BO(Business Object)—业务对象层

表示应用程序领域内“事物”的所有实体类。这些实体类驻留在服务器上,并利用服务类来协助完成它们的职责。

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

主要用于远程调用等需要大量传输对象的地方。比如一张表有100个字段,那么对应的PO就有100个属性。但是界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,这时就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

POJO(Plain Old Java Objects) 简单的Java对象

实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来,而且简称比较直接。其中有一些属性及其getter、setter方法的类,有时可以作为value object或dto(Data Transform Object)来使用。当然,如果有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

真的有必要定义 VO,BO,PO,DO,DTO 吗

在讲具体的概念之前,先简单的讲一讲MVC开发模式。MVC的简单定义:

  • M层负责与数据库打交道;
  • C层负责业务逻辑的编写;
  • V层负责给用户展示(针对于前后端不分离的项目,不分离项目那种编写模版的方式,理解V的概念更直观)。

?> 而VO,BO,PO,DO,DTO呢,就是穿梭在这M、V、C层之间的实体传输对象。

实体传输对象示意图:

2022-07-21-08-25-59.258439200

  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  • DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,更符合泛指用于展示层与服务层之间的数据传输对象。
  • BO(Business Object):业务对象,把业务逻辑封装为一个对象,这个对象可以包括一个或多个其它的对象。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

有必要用吗?
项目中真的有必要定义VO,BO,PO,DO,DTO吗?

还是要理性看待这个问题,要看项目“目的地”是什么。

如果项目比较小,是一个简单的MVC项目,又是单兵作战,不建议使用VO,BO,PO,DO,DTO,直接用POJO负责各个层来传输就好,因为这种项目的“目的地”是快速完成。
而更多的时候,是持续迭代的团队协作项目,这个时候就建议用VO,BO,PO,DO,DTO,而且团队内要达成共识,形成一个标准规范。

  1. 业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性;
  2. 让类语义更明确,很容易知道类的含义;

其实就是提升项目的可扩展性、可维护性与可阅读性。
提升这些性能的尽头是经济效益。

总结

这篇文章很短,最后稍微总结一下,不管用哪种方式,只要团队内定义好一种适应的协同规范就行。
没有一个绝对好与绝对坏的方式方法。
团队规范的尽头能提升项目的可扩展性、可维护性与可阅读性,从而降低bug率。
另附这些概念命名规范:

  • 数据对象:xxxPO,xxx即为数据表名。(也可DO)
  • 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
  • 展示对象:xxxVO,xxx一般为网页名称。
  • 业务对象:xxxBO,xxx是业务名称。

POJO、Java Bean 是如何定义的

在日常开发中还有一些类经常被人叫做POJO,还有的人叫它们Java Bean。这些概念都是在特定场景下引入,用来表明它们的特性的。那这些称呼都是啥意思,有啥标准和特征呢?今天就来分享一下这些没用的知识。

POJO

POJOPlain Old Java Object 的简写,大概意思就是“淳朴的Java对象”。这个词是国外一家外包公司的员工创造的。哪些类是POJO类还是有说法的,需要同时满足以下几个条件:

  1. 不实现任何接口的类。
  2. 不继承任何其它类的类。
  3. 不使用任何外部注解的类。

这种类其实就是切断了和外界联系的Java类,下面这个类肯定不是:

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

这个才是POJO

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

Java Bean

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 BeanSpring Bean的要求就低多了,只要这个类(接口)被注入了Spring IoC,那么这个类(接口)都可以被称作一个Spring Bean。至于一个类如何注入Spring IoC,这里就不说了,大家天天都在做。

最后

最后,可以得出结论,一个POJO总是孤孤单单的,它不可能成为一个Java Bean或者Spring Bean;但是Java Bean可以同时是一个Spring BeanSpring Bean也可以是一个Java Bean

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最强提示词技巧,没有之一!(全网首发)

我们总是希望AI按照我们的要求来进行回复。 通常,当回复不符合预期的时候,我们需要通过不断优化提示词,让AI慢慢学习,慢慢领悟我们的意图,直到符合我们的预期。而这个过程,往往需要长时间多轮往复。 举个栗…

【网络原理】初学网络必备知识

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 本期讲解什么是局域网与广域网,网络通信基础知识之IP地址、端口号、协议、五元组。…

springboot第25集:实体类定义规则

PO:持久化对象,一个PO对象对应一张表里面的一条记录。全部对应 VO:View视图对象,用来在页面中展示数据的,页面需要哪些字段属性就添加哪些,查询出来之后赋值操作比PO对象要简单。所以提高性能。 DTO&#x…

paddle 目标检测C++部署流程

1 源码下载以及依赖库 PaddleDetectionopencv3.4.6paddle_inference10.2 2 C 编译流程 手动配置cmake的依赖库路径 报错1 报错2 报错3 编译结果 3 测试 略

梵想 S690MQ 4TB固态尝鲜,我的磁盘空间又充裕了

先上一张我的工作电脑磁盘空间图,系统盘装了非常多的开发环境非常吃紧,数据盘D盘存着大部分虚拟机估计再过没多久也要告急了,之前磁盘已经红过一次,清理了下微信聊天记录感觉还能挺几个月。 对于爱折腾系统的我 1.5T 的磁盘空间已…

数据库的增删改查(二)

1、数据库约束 关系型数据库的一个重要功能 主要作用是保证数据的完整性,也就是数据的正确性(数据本身是正确的,关联关系也是正确的) 人工检查数据的完整性的工作量非常的大,在数据表定义一些约束,那数据…

从“制造”到“智造”!宏工科技发布“宏梦智能制造云”新产品

产业周期性变化正在给锂电产业带来深刻变革。6月7日,宏工科技在2023高工锂电材料大会上发表演讲表示,宏工科技推出了“宏梦智能制造云”,以整线一体化智造思路,赋能电池材料生产智造转型。 全球电动化与储能市场双轮驱动&#xff…

GPS跟踪系统Traccar

什么是 Traccar ? Traccar是一个开源的 GPS 跟踪系统。支持 200多种GPS 协议和 2000 多种型号的 GPS 跟踪设备。当然也包括像 iOS/Android 这样的手机设备,手机设备只需要安装Traccar的客户端即可使用。 前文介绍的 Hauk 只支持 Android 客户端&#xff…

数据分析第13课Matplotlib可视化

官网:https://matplotlib.org/users/installing.html 04-1Matplotlib介绍与安装 Matplotlib介绍 什么是Matplotlib Matplotlib是一个Python的基础绘图库,它可与 NumPy(科学计算的) 一起使用,代替Matlab(计算很好)使用。 为什么要学习Matplotlib(灵活度高) 将数据…

AutoHotKey文件与路径交互操作

文章目录 路径操作文件选择文件读写文件属性 AHK作为一种脚本语言,其功能特点是对操作系统功能的整合与简化,从而缩减操作流程,从而起到提高效率的目的。鼠标、键盘的映射,相当于是对外设操作的简化,而除了外部交互之外…

docker harbor私有仓库部署

docker harbor私有仓库部署 docker system prune -a 删除停掉的服务,自定义网络等。 docker 私有仓库 docker配置文件 vim /etc/docker.daemon.josn { “insecury-registries”: ["192.168.232.10:5000],#指定私有仓库 } docker pull/push 19…

chatgpt赋能python:Python中引入其他包的指南

Python中引入其他包的指南 Python是一种流行的编程语言,拥有丰富的开源软件包和库。许多Python程序将使用其他包来增强其功能。在本文中,我们将探讨如何在Python项目中使用和引入其他包。 什么是Python包和库? Python包是一组可重复使用的…

冈萨雷斯DIP第7章知识点

文章目录 7.3 相关7.5 基图像7.6 傅里叶相关变换7.6.1 离散哈特利变换7.6.3 离散正弦变换 DIP的其他章节都好复习,唯独就这个第7章小波变换。复习起来十分头大,所以我开始写他的课后题,雾。 7.3 相关 已知两个连续函数 f ( x ) f(x) f(x) …

单链表【数据结构、数组模拟】

不采用动态链表 一般情况下,都是直接使用下面的代码进行模拟的 struct Node{int val;Node *next; }然后当我们需要进行创建一个新的节点时,都需要使用new Node(),非常慢!!! 数据规模一般都是10w~100w的数…

Android性能分析工具:Perfetto介绍及用法

本文字数:8409字 预计阅读时间:22分钟 概念 什么是Perfetto?Perfetto是Android 10中引入的全新平台级跟踪工具。这是适用于Android、Linux和Chrome的更加通用和复杂的开源跟踪项目。与Systrace不同,它提供数据源超集,可让您以pro…

【6.09 代随_52day】 最长递增子序列、最长连续递增序列、最长重复子数组

最长递增子序列、最长连续递增序列、最长重复子数组 最长递增子序列1.方法图解步骤递归代码 最长连续递增序列1.动态规划的方法图解步骤代码 最长重复子数组图解步骤代码 最长递增子序列 力扣连接:300. 最长递增子序列(中等) 1.方法 dp[i]…

开源 Golang 微服务入门三:ORM 框架 GORM

前言 前两篇笔记分别介绍了 Golang 微服务 HTTP 框架 Hertz 和 Golang 微服务 RPC 框架 Kitex,本文将要介绍面向ORM(持久层)框架 GORM。 官方文档 GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL&#x…

【TCP/IP】多进程服务器的实现(进阶) - 僵尸进程及wait、waitpid函数

目录 僵尸(Zombie)进程 僵尸进程的产生机制 僵尸进程的危害 僵尸进程的销毁 wait函数 waitpid函数 进程管理在网络编程中十分重要,如果未处理好,将会导致出现“僵尸进程”,进而影响服务器端对进程的管控。 僵尸(Zombie)进程 第一次听到…

继万物分割SAM之后,万物识别模型RAM来了!

Recognize Anything: A Strong Image Tagging Model 提出“识别万物模型”(Recognize Anything Model,RAM),用于图像打标签。RAM 可以高精度地识别任何常见类别。RAM 引入了图像打标签的一个新范式,利用大规模的图像-文…

如何在RPC和RESTful之间做选择?

不同软件系统之间的通信可以通过RPC(远程过程调用)或RESTful(表现层状态转移)协议来建立,这些协议允许多个系统在分布式计算中协同工作。 这两种协议在设计哲学上有所区别。RPC使得可以像调用本地过程一样调用服务器上…