dto 是只给前端需要的数据吗_DO、VO、DTO...XXOO,你弄明白了么

技术公众号:Java In Mind(Java_In_Mind),欢迎关注!

背景

我相信,刚开始学习接触企业代码的时候,一定会发现,工程中充斥着各种XO:DO、VO、DTO、DAO,还有各种名词:POJO,JavaBean,Domain等等,这些貌似看起来都一样,又好像用在不同的地方,记得之前一个前端同事调侃说:“我不想学Java,各种OOO,脑壳疼!”,这里结合自己的理解对这几个名词做些介绍。

何为POJO

POJO(Plain Ordinary Java Object),即简单Java对象,就是一个我们最常见的普通Java对象,这个概念是被大家叫出来的,它具有一些属性,然后提供对应的getter和setter,如下:

public class Foo {

private String name;

private String type;

public String getName(){

return this.name;

}

public void setName(String name){

this.name = name;

}

public String getType(){

return this.Type;

}

public void setType(String type){

this.type = type;

}

}

何为JavaBean

JavaBean,可序列化的POJO,sun在早期有对其规范(JavaBeans Spec),它是Java中的可重用组件,主要规范约定如下:JavaBean为公共类,并且具有一个空构造函数

所有属性为私有属性,提供getter和setter,不应该有公共属性

实现序列化接口:java.io.Serializable

JavaBean已经成为Java的一种规范,也是Java社区的共同语言,许多工具框架也是遵循JavaBean的规范的,例如,Spring的BeanUtils,一些Json工具都是基于JavaBean的规范来实现的,这些都是基于约定,所以也有人把JavaBean叫为可以持久化的POJO。

何为DO

DO(Domain Object),领域对象,也就是ORM框架中对应数据库的对象,业务实体,例如,对现实世界中的用户建模,抽象出来的DO可以叫为UserDO,通常情况下它用于与数据库的数据交互,通常也是一个JavaBean。

何为PO

PO(Persistent Object),持久化对象,主要用于持久化层,与数据库对应,通常也是ORM框架中的实体对象,例如,使用JPA时候的Entity与数据库表做映射,通常是一个JavaBean。

何为DTO

DTO(Data Transfer Object),数据传输对象,顾名思义就是用于传输数据的对象,通常用于处于不同架构层次或者不同子系统之间的数据传递,或者用于外部接口参数传递,以便提供不同粒度不同信息的数据,以免造成困惑干扰,通常也是一个JavaBean。

何为VO

VO(Value Object),就是用于保存数据的对象;在提供给页面使用的时候,也有人解释为View Object,就是对应页面展示数据的对象。

何为DAO

DAO(Data Access Object),数据访问对象,与数据库做交互的对象,提供不同的接口访问数据库来实现对数据库的操作,而接口使用的数据交互通常就是PO或者DO,通过它可以使用面向对象的方式来与数据库交互。

总结DO、PO、VO、DTO等其实都是一个JavaBean,只是应用的范围不同,表示的意义不同,而这些不同是Java这么多年来形成的一种约定,这种习惯形成Java程序员之间一种共识

DO和PO大部分时间是一样的,不过PO更倾向于有状态的对象,例如,使用Hibernate的时候,通过DAO操作过的对象会被框架所持有,如果一旦对其操作,在Session关闭的时候会写回数据库,这个时候使用PO就要非常小心,特别是与其他业务层交互的时候,最好转成DTO或者VO提供数据,不能把持久化对象暴露出去,不然可能会导致数据被修改

在使用这类对象的时候,我们还是要明白其意义,然后在合适的场景使用,毕竟这是Java形成的通用语言,想要读懂他人代码就要理解,想要他人能读懂自己的代码就要遵循

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

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

相关文章

Javascript判断object还是list/array的类型(包含javascript的数据类型研究)

前提:先研究javascript中的变量有几种,参考: http://www.w3school.com.cn/js/js_datatypes.asp http://glzaction.iteye.com/blog/1285147 测试1: typeof关键字 var obj {test:test}; typeof obj;//输出object var list [{test:t…

Core Data

简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何…

tbase同步mysql_mysql主从同步

MySQL主从介绍MySQL主从叫做Replication、AB复制,A和B做主从后,在A上写数据。B上也会同步A的数据,两者实现实时同步MySQL是基于binlog日志来同步的,主上必须开启binlog才能进行主从同步,同步过程大概有三个步骤(1)主将…

2017将转行进行到底

2016 年说着转行,最后还是在匆匆中找了一份老本行,此刻的心情还是无爱,毕竟螺丝一直分不清啊,不喜欢就是不喜欢。看了django的教程,不得不感叹国外的书写的相对优秀一点,《learning django web development…

mysql中函数是否可以返回多个值_是否可以从mysql函数返回多个值?

我的脏解决方案是:1.连接字符串中的值. 2返回字符串. 3 Splits将字符串返回值.我认为它不优雅,我确信这有局限性,但它适用于简单的情况还有必要创建分裂函数,因为Mysql没有这个函数:首先编辑你的功能.CREATE FUNCTION yourFunctionWith2valuesForReturni…

lua自定义迭代器

迭代器 http://www.tutorialspoint.com/lua/lua_iterators.htm 迭代器能够让你遍历某个集合或者容器中的每一个元素。 对于lua来说, 集合通常指代 table, 用于创建变化的数据结构, 类似数组。 Iterator is a construct that enables you to t…

mysql非主键索引_主键索引和非主键索引的区别

1. 什么是最左前缀原则?以下回答全部是基于MySQL的InnoDB引擎例如对于下面这一张表如果我们按照 name 字段来建立索引的话,采用B树的结构,大概的索引结构如下如果我们要进行模糊查找,查找name 以“张"开头的所有人的ID&#…

优美的配色方案设计

2019独角兽企业重金招聘Python工程师标准>>> 怎么做好设计配色一直是个难题,虽然网站上有各种各样的色库,但配色仍然至关重要,不得已的话可以亲自动手,况且乐趣满满。 这个没有一套标准,所以看自己怎么喜欢…

It's a start!

开始博客之旅转载于:https://www.cnblogs.com/catchingdream/p/5843172.html

mysql死锁释放时间参数_【Mysql】mysql 事务未提交导致死锁 Lock wait timeout exceeded; try restarting transaction 解决办法...

问题场景问题出现环境:1、在同一事务内先后对同一条数据进行插入和更新操作;2、多台服务器操作同一数据库;3、瞬时出现高并发现象;不断的有一下异常抛出,异常信息:org.springframework.dao.CannotAcquireLo…

ORACLE sqlplus设置行数和宽度

1) 查看目前的pagesize,默认是14:Sqlplus代码show pagesize; 2) 将pagesize设置好100,则可以一次显示够多行记录了:Sqlplus代码set pagesize 100; 2. 设置行的宽度1) 查看目前的linesize,默认是80:Sqlplus代码show linesize; 2) 设置成100或者更宽都可以:Sqlplus代码set li…

mysql关系模式怎么画_关系数据库与mysql

表下面是阿里的mysql设计原则,可以参考,不一定按照阿里规则,但一个团队一定要有规则,如果现在没有规则,从现在开始,慢慢推广,适应1.【强制】表达是与否概念的字段,必须使用 is_xxx的…

Javascript 构造函数模式、原型模式

前两天写完组合继承,打算总结一下原型继承的,不过今天看了一下工厂模式、构造函数模式和原型模式,觉得有必要总结一下以加深印象。 ———————————————————————————————————————————————————…

2016年CCF第七次测试 俄罗斯方块

1 //2016年CCF第七次测试 俄罗斯方块2 // 这道小模拟题还是不错3 // 思路&#xff1a;处理出输入矩阵中含1格子的行数和列数4 // 再判是否有一个格子碰到底部&#xff0c;否则整体再往下移动一步&#xff0c;如果有一个格子不能移动&#xff0c;要返回到前一步5 6 #include <…

springmvc视图解析器_SpringMVC视图及REST风格

什么是视图解析器&#xff1f;springMVC用于处理视图最重要的两个接口是ViewResolver和View。ViewResolver的主要作用是把一个逻辑上的视图名称解析成一个真的的视图&#xff0c;而SpringMVC中用于把View对象呈现给客户端的是View对象本身&#xff0c;而ViewResolver只是把逻辑…

mysql5.7.x 1251_MySql-8.0.x免安装版下载与配置,Navicat打开数据库链接报错1251的解决办法...

概述MySQL从5.7一下子跳到了MySQL8.0, 其中的变化必然是很大的, 这里就不说了, 本文主要讲解最新版MySQL安装的事情.实际上5.7版本后的mysql免安装版都是没有data文件和my.ini文件的&#xff0c;下面再具体说明怎么生成&#xff0c;注意不能自己手动新建.下载下载程序必然去官网…

To install 64-bit ODBC drivers

为了更充分的利用硬件资源&#xff0c;我想很多人都开使用64位操作系统了&#xff0c;同时你可以也发现了在64位操作系统上ODBC的驱动找不到了&#xff0c;所以ODBC的东西都没法用了。 因为2007以前版本的Office只有32位版本&#xff0c;所以我们不能在64位系统上使用ODBC。使用…

【Qt开发】QTableWidget设置根据内容调整列宽和行高

QTableWidget要调整表格行宽主要涉及以下一个函数 1.resizeColumnsToContents(); 根据内容调整列宽 2.resizeColumnToContents(int col); 根据内容自动调整给定列宽 3.horizontalHeader()->setResizeMode 把给定列…

深入浅出mysql数据开发_深入浅出MySQL数据库开发、优化与管理维护 PDF扫描版[513KB]...

深入浅出MySQL数据库开发、优化与管理维护 内容介绍&#xff1a;本书从数据库的基础、开发、优化、管理维护4个方面对MySQL进行了详细的介绍&#xff0c;其中每一部分都独立成篇。本书内容实用&#xff0c;覆盖广泛&#xff0c;讲解由浅入深&#xff0c;适合于各个层次的读者。…

Understand Lambda Expressions in 3 minutes(翻译)

本文翻译自CodeProject上的一篇简单解释Lambda表达式的文章&#xff0c;适合新手理解。译文后面我补充了一点对Lambda表达式的说明。 1.什么是Lambda表达式&#xff1f; Lambda表达式是一种匿名方法&#xff0c;多数情况下用来在LINQ中快速创建委托。简单地说&#xff0c;它代表…