一个新的开始

转载 2007年09月15日 17:02:00

       呵呵,我是一个不善于表达自己东西的人,手底下也不太会写东西。今天突然有点冲动想写点东西,就转点别人的东西过来吧,毕竟站在巨人的肩膀上还是有好处的拉。经过项目开发的过程之后,感觉自己缺的东西实在太多了,可是现在又没有上大学的时候那股劲,买本书好好研究下,没办法只能借助网络这个咚咚来充实自己了。

何谓“持久化”
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

何谓“持久层”
持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

何谓“对象数据映射(ORM)”
ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。

备注:建模领域中的 ORM 为 Object/Role Modeling(对象角色建模)。另外这里是“O/R Mapper”而非“O/R Mapping”。相对来讲,O/R Mapping 描述的是一种设计思想或者实现机制,而 O/R Mapper指以O/R原理设计的持久化框架(Framework),包括 O/R机制还有 SQL自生成,事务处理,Cache管理等。


除了 ORM 技术,还有以下几种持久化技术

主动域对象模式
它是在实现中封装了关系数据模型和数据访问细节的一种形式。在 J2EE 架构中,EJB 组件分为会话 EJB 和实体 EJB。会话 EJB 通常实现业务逻辑,而实体 EJB 表示业务实体。实体 EJB 又分为两种:由 EJB 本身管理持久化,即 BMP(Bean-Managed Persistence);有 EJB 容器管理持久化,即 CMP(Container-Managed Persistence)。BM P就是主动域对象模式的一个例子,BMP 表示由实体 EJB 自身管理数据访问细节。
主动域对象本身位于业务逻辑层,因此采用主动域对象模式时,整个应用仍然是三层应用结构,并没有从业务逻辑层分离出独立的持久化层。

JDO 模式
Java Data Objects(JDO)是 SUN 公司制定的描述对象持久化语义的标准API。严格的说,JDO 并不是对象-关系映射接口,因为它支持把对象持久化到任意一种存储系统中,包括 关系数据库、面向对象的数据库、基于 XML 的数据库,以及其他专有存储系统。由于关系数据库是目前最流行的存储系统,许多 JDO 的实现都包含了对象-关系映射服务。

CMP 模式
在 J2EE 架构中,CMP(Container-Managed Persistence)表示由 EJB 容器来管理实体 EJB 的持久化,EJB 容器封装了对象-关系的映射及数据访问细节。CMP 和 ORM 的相似之处在于,两者都提供对象-关系映射服务,都把对象持久化的任务从业务逻辑中分离出来。区别在于 CMP 负责持久化实体 EJB 组件,而 ORM 负责持久化 POJO,它是普通的基于 Java Bean 形式的实体域对象。

一般把基于 Java Bean 形式的实体域对象称为 POJO(Plain Old Java Object),意为又普通又古老的 Java 对象的意思。随着各种 ORM 映射工具的日趋成熟和流行,POJO有重现光彩,它和基于 CMP 的实体 EJB 相比,即简单又具有很高的可移植性,因此联合使用 ORM 映射工具和 POJO,已经成为一种越来越受欢迎的且用来取代 CMP 的持久化方案。POJO 的缺点就是无法做远程调用,不支持分布式计算。


为什么要做持久化和ORM设计

在目前的企业应用系统设计中,MVC,即 Model(模型)- View(视图)- Control(控制)为主要的系统架构模式。MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)等。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。而 ORM 作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。

简单来说,按通常的系统设计,使用 JDBC 操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。
一般基本都是如下几个步骤:
1、建立数据库连接,获得 Connection 对象。
2、根据用户的输入组装查询 SQL 语句。
3、根据 SQL 语句建立 Statement 对象 或者 PreparedStatement 对象。
4、用 Connection 对象执行 SQL语句,获得结果集 ResultSet 对象。
5、然后一条一条读取结果集 ResultSet 对象中的数据。
6、根据读取到的数据,按特定的业务逻辑进行计算。
7、根据计算得到的结果再组装更新 SQL 语句。
8、再使用 Connection 对象执行更新 SQL 语句,以更新数据库中的数据。
7、最后依次关闭各个 Statement 对象和 Connection 对象。

由上可看出代码逻辑非常复杂,这还不包括某条语句执行失败的处理逻辑。其中的业务处理逻辑和数据存取逻辑完全混杂在一块。而一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程,假如要对其中某些业务逻辑或者一些相关联的业务流程做修改,要改动的代码量将不可想象。另一方面,假如要换数据库产品或者运行环境也可能是个不可能完成的任务。而用户的运行环境和要求却千差万别,我们不可能为每一个用户每一种运行环境设计一套一样的系统。
所以就要将一样的处理代码即业务逻辑和可能不一样的处理即数据存取逻辑分离开来,另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。所以为解决这一困难,就出现 ORM 这一个对象和数据之间映射技术。

 

微生物增殖 假设有两种微生物 X 和 Y,X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y.

/* * 微生物增殖 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。 一个新出生的X,半分钟之后吃掉1个Y,并且,从...

心里藏着一个人,怎么能开始一段新的感情

我和她相遇在大学校园,大学四年我俩过的很幸福,很是被同学羡慕,不仅因为我俩学习好,说实话她比我成绩优秀,更重要的是她很美丽,我长的也不赖,我们专业公认的郎才女貌的一对,尽管生活中难免有一些磕磕绊绊,但...

B/S项目结束,又是一个新的开始

在软考后,B/S项目也结束了。从今年的三月份,到现在的十一月份,历时八个月,期间有过因为合作、参与项目、软考等方面原因中断,而原本计划在半年完成的项目用了八个月。     学习完B/S项目,看着今目...

【开博第一文】一个新的开始

大学是什么呢,什么是大学生活呢。在高中时期,从来没有构想过大学生活的我就这样在大学生活了两个月,以无知为借口懵懂并荒废的两个月。 这两个月我做了些什么?《C primer plus》,没看完;《C和指...

开始一个新的地方作为自己技术的心灵园田,新浪微博太伤我心了

如图所示,一次又一次,最终我还是爆发了,以后不再为新浪博客提供点击量了. 第一,你看到我微博名字就不应该盗我的账号,程序员的辛苦你们不了解过么?你们新浪微博不也是程序员开发你们的项目,你们的项目才能...

11年一个新的开始

      今年的寒假都已经快要结束了,可是对比一下之前做的计划,遥遥不可及。也许这是特殊的一年,本来平淡无奇,却世事弄人。这也许是我大学毕业前最后一次对自己的鞭策,我本是一个意志力强大的,却偏偏走在...

[心情]回顾&一个新的开始

0x00 前言 不知不觉,当个初级码农也好几个年头了。没玩过博客、微博,没写过文章,没与太多人交流过技术,没分享过自己的经验、心得。总觉得会不会太失败了。码农的一大优秀品德就是分享,那么...

一个新的开始,用博客记录自己的成长

作为16年的毕业生,是非常艰难的。今年感觉什么行业都不是很景气。今年也是Android初级人才市场趋于饱和或者已达饱和的一年,所有人都不敢轻易的换掉手中的工作,即使目前的公司和自己理想的公司差别很大,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个新的开始
举报原因:
原因补充:

(最多只允许输入30个字)