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. window.onload,<body onload="function()">, document.onreadystatechange, httpRequest.onreadystatechang

    部分内容参考:http://www.aspbc.com/tech/showtech.asp?id=1256 在开发的过程中,经常使用window.onload和body onload两种,很少使用do ...

  2. 鼠标悬停移除更换class

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

  3. 双人贪吃蛇小游戏C++原创

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang /*贪吃蛇*/ #include<stdio.h> #include<time. ...

  4. [HDU] 1698 Just a Hook [线段树区间替换]

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. java 将GBK编码文件转为UTF-8编码

    需要commons-io-2.0.1.jar public class Test { public static void main(String args[]) throws IOException ...

  6. hdu 2473 Junk-Mail Filter

    http://acm.hdu.edu.cn/showproblem.php?pid=2473 并查集设置虚拟父节点. #include <cstdio> #include <cstr ...

  7. 原已经安装好的nginx,现在需要添加一个未被编译安装的模块--echo-nginx-module-0.56

    为了测试一个NGINX变量,将NGINX加了一个编译模板echo-nginx-module-0.56. 参照如下文件 1,先看以前NGINX有哪些东东. sbin/nginx -Vnginx vers ...

  8. 解决Qt5 Creator无法切换输入法(fcitx),不能录入汉字问题

    笔者系统环境,Ubuntu 14.04,输入法fcitx下搜狗输入法. 其它非Ubuntu linux发行版,不通过软件源安装Qt5,从Qt官网http://qt-project.org/下载安装包, ...

  9. idea

    一. 常用快捷键 搜索class Ctrl+N 搜索文件 Ctrl+Alt+N 当前窗口查找/全工程查找 Ctrl+F/Ctrl+Shift+F,F3/Shift+F3前后移动 上/下一个位置 Ctr ...

  10. linux find详解

    find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> - < ...