java的po vo dao dto pojo


1各个术语的简介

PO(persistant object)持久对象

最形象的理解就是一个PO就是数据库中的一条记录.PO是在ORM中出现的概念,就是ORM中的O,将数据库中的数据模型映射成为一个java对象.简单的PO就是对应数据库中某一张表的一个记录,多个记录就用PO的集合来表示.PO中不能包含任何对数据库的操作

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

顾名思义就是与数据库打交道,加载业务逻辑和数据库资源之间.DAO模式是J2EE的设计模式,实际上是两个模式的组合,即Data Accessor(数据访问者)模式和ACtive Domain Object(领域对象)模式.Data Accessor模式实现了数据访问和业务逻辑的分离;Active Domain Objecet模式时间了业务数据的对象化封装.(高大上的两种模式是啥子O^O)

BO(Bussiness Object)业务对象

封装业务逻辑的java对象,我的理解就是我们的service实现.

POJO(Plain Ordinary Java Object)简单的java对象

用来表示普通的Java对象,不是JavaBean,EntityBean或者SessionBean.POJO不担当任何的特殊角色,不继承,也不实现其他Java框架的类或者接口.通常只有property的属性和public的getter和setter

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

这个概念也是来源于J2EE的设计模式,用于展示层和服务层之间数据传输对象.通过DTO,服务器只会将view层所需要的数据传输给view层,而不需要吧数据库中全部数据都传递给view层.

VO
  • ViewObject视图对象
    用于MVC的View层,把某个制定页面(或组件)的所有数据封装起来.
  • value object值对象
    用于业务层之间的数据传递.通常是抽象出来的业务对象,可以和表对应,也可以不,根据业务需求来定.

2常见的一些术语的区别

VO(ViewObject)与DTO

在我们日常开发的过程中,很多情况下VO与DTO通常都是一样的,只是一个POJO(简单的java对象).从实现的角度上看,我们完全可以将DTO与VO合并到一起.但是从设计层面来说(好高大上),概念上还是应该存在VO和DTO,因为两者有着本质的区别,DTO代表服务层需要接收的数据和返回的数据,而VO代表展示层需要显示的数据。

网上举了一个关于男女的例子:
展示层与服务层交互的时候,通过DTO传给后台的只有为0和1,但是在展示的时候展示层会显示"男""女",我们可以考虑将VO和DTO两个概念合并到一起,不用DTO,直接用VO传递给服务层"男""女",这样也可以实现功能的.但是如果这时候客户要求可以定制风格,可以用"帅哥""美女"来区分性别,这时候显然就不能用VO来完成全部工作了,需要在展示层用两个不同的VO来表示不同的展示形式,而与服务端交互的时候使用DTO来进行数据传输.

当然上面这个例子的前提是我们没有使用js这样的脚本语言,在web现阶段的开发中,因为js的普遍使用,我们完全可以将VO与DTO合到一起,有js来控制展现形式.但是概念还是要分清楚的,VO只是负责展示,DTO是用来数据传输的.

DTO与PO

在很多只设置到单表操作的业务中,PO与DTO通常也是相同的(DTO和VO经常也是相同的,所以VO与PO也是相同的),当数据模型简单,字段较少的时候,服务层也可以直接将PO交给展示层展示.但是字段较多,而展示层又只需要展示很少的字段;或者展示层要展示的数据涉及到多张表,需要多个PO合并到一起的时候,我们需要DTO来进行数据传输.

PO与POJO

PO持久对象是ORM框架中的概念,而POJO是java语言中的概念.PO作为一个持久对象,表示数据库中的一条记录,有insert语句创建,有delete语句删除,PO的生命周期与数据库是密切相关的;而POJO作为java中的一个对象,有new创建,由GC回收,显然要比PO朴素的多.另外PO往往只存在于一个数据库Connection之中,Connection关闭以后,持久化对象就不存在了,而POJO只要不被GC回收就会一直存在的.
想比与POJO,PO起码会多一些用来管理数据库entity状态的属性和方法.但是ORM追求的目标就是让PO在使用上尽量和POJO一直,所以我们在日常使用中PO就可以当成一个POJO使用,区分PO和POJO是hibernate的事情.

VO与VO(-.-)

以下纯属个人看法,有异议可以提出来共同探讨一下.
从MCV框架上看,ViewObject是在view层的数据,只用于view层的处理,与其它层完全没有联系(数据交流是DTO的事情).而ValueObject既然是业务处理之间的数据交互,那么它就是modol层的数据.所以完全不是一个东西嘛~

3相关链接

4相关知识

数据访问者模式?领域对象模式?javaSE 23中设计模式?

Java中的各种o的更多相关文章

  1. java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...

  2. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  5. Java中常用集合操作

    一.Map 名值对存储的. 常用派生类HashMap类 添加: put(key,value)往集合里添加数据 删除: clear()删除所有 remove(key)清除单个,根据k来找 获取: siz ...

  6. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  7. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  8. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  9. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

  10. 初探java中this的用法

    一般this在各类语言中都表示“调用当前函数的对象”,java中也存在这种用法: public class Leaf { int i = 0; Leaf increment(){ i++; retur ...

随机推荐

  1. 【干货】.NET开发通用组件发布(四) 日志记录组件

    组件介绍和合作开发 http://www.cnblogs.com/MrHuo/p/MrHuoControls.html 日志记录组件功能介绍 通过基类Logger,实现了文本记录日志和数据库记录日志两 ...

  2. jdk,j2ee,j2se,j2me的概念区别

    jdk,j2ee,j2se,j2me的概念区别1.JDK是Java development toolkit,相当于是Java的库函数,是编译,运行java程序的工具包.J2EE是Java 2 ente ...

  3. 鼠标悬停移除更换class

    $("#xinl").mouseover(function()  //鼠标悬停执行函数 { $(".xl").removeClass().addClass(&q ...

  4. The Lead Game Add problem to Todo list Problem code: TLG

    '''def count_lead(first, second): if first > second: return 1, first - second elif first == secon ...

  5. Hdu1092

    #include <stdio.h> int main() { ; while(scanf("%d",&n)){ ) {;} else{ int i,a; ;i ...

  6. 微软企业库的Cache

    微软企业库的Cache 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.基于微软的企业库,我们的快速创建一个缓存的实现. 新建PrismSamp ...

  7. Spark添加/更改集群节点需要修改的配置文件

    笔记:在配置好了spark后,如果需要添加/删除一个结点需要修改如下配置文件 cd $HADOOP/etc/hadoop 进入hadoop配置文件夹下 修改 slaves,将对应的节点添加/删除 修改 ...

  8. Jasper_table_pass parameter to table component

    <subDataset name="Dataset1" uuid="2a894ef4-dbcc-47df-bfaf-027766c7352e"> 2 ...

  9. mysql 5.7 内存使用监控

    5.7 中的performance_schema 已经有能力监控mysql 的内存使用情况了,对于这一点也是要通过instrument 来实现的,由于内存这一块没有对应的consumer 所以只要 配 ...

  10. Android AsyncTask 异步任务操作

    1:activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi ...