您的位置:首页 > 其它

持久化的一些相关概念

2011-09-09 23:45 169 查看
转自:http://www.iteye.com/topic/68651

author:bilo



一、JDBC & ORM

JDBC提供了一套API,以统一的方式访问各种异构的数据库。在这方面它的功能极佳,并比其他的数据库连接API易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。使用JDBC对数据库中的数据进行增加、删除和修改的操作就是持久化的过程。

然而,直接使用JDBC作为持久层有一些难以解决的问题,这些问题包括繁琐的代码、表间连接、级联以及层与层之间的耦合严重等问题,在这种情况下就需要ORM来对数据库进行持久化。

O/R Mapping(Object-Relational Mapping,ORM),其作用是在关系型数据库和类对象之间做映射。通过这个映射,做具体数据库操作时,就不用再和复杂的SQL语句打交道,只要像平时操作对象一样来操作即可,是当今最流行一种数据库持久化方案(另一种则是JDO,它基于字节码增强来实现持久化),如Hibernate,iBATIS。

二、DAO(Data Access Object)

DAO(Data Access Object)数据访问对象,作为很早就出现的一种模式,至今仍然非常有用。他的作用是全权承担业务逻辑的持久化操作。每一个领域模型就对应一个DAO操作(或者说每一个表就对应一个可操纵数据库的DAO对象)。DAO模式好处在于,将JDBC从业务逻辑中隐藏起来,业务逻辑不再关心象JDBC这样的底层操作,全权将其交给DAO处理,你可以很清楚的看到那些持久化对象被取出创建或者修改。而当你需要更改数据库或者栏位的时候,你只需要改掉DAO就好,而不需要重写你的业务逻辑。

然而,这样的DAO实现其本质就是在JDBC之上实现了一层薄薄的封装,对于现在复杂而厚重的商业逻辑持久化来说,它看起来确实显得“单薄”了些。基于DAO这种简单的实现依然有很多问题,“透明持久化”概念提供了更优雅的解决方案。

三、Transparent Persistence(透明持久化)

“透明持久化”通常由框架来实现,而不是由应用本身来关心。它能完全剥离业务的持久化操作,仅仅只需提供一个接口供业务逻辑调用(如Hibernate的Session,JDO的PersistenceManger——JDO并不是基于O/R映射,而是基于字节码增强来实现透明持久化的,iBATIS的SqlMap对象等)。它可能还有自己特殊的语意(如Hibernate的HQL,因为它必须自己实现真正的SQL,提供的HQL可以简化这一过程,同时也简化了业务逻辑持久化时的工作量)。

虽然实现“透明持久化”方案非常复杂,但我们不需要重新发明轮子,多数情况下,Hibernate,iBATIS,JDO实现已经完全可以满足我们的持久化需求。

四、关于Hibernate,iBATIS和JDO

Hibernate,iBATIS都是基于O/R映射的,但两者却非常的不同。

iBATIS是SQL的映射,其设计理念为:将SQL语句在XML中定义,并预留占位符(可以指定参数的SQL类型和其他细节)。在执行时,占位符被指定的参数值所取代,参数来至参数映射表、JAVABEAN属性或者搜简单的参数对象。在执行SQL查询时,结果字段将被映射到对象,映射的方式与参数映射是一样的。

而Hibernate则提供了更完善的透明持久化。它为应用程序追加了O/R映射的语意——HQL。HQL查询语言让开发者可以在领域对象的层面来利用SQL的强大功能(即在一定程度是你不在需要自己组装SQL,或者说HQL让组装变得更简单了,而且也不再需要象上面那样,在大量的DAO面前不得不让特定的程序来生成笨重的代码)。

JDO是一组规范,并定义了一系列API,它是除O/R映射以外,用另一种——基于字节码增强的——方式来实现透明持久化的。所谓的字节码增强,是指在做业务动作时,被增强的持久化对象实例如果被修改(即数据的变动通过字节码的变动而被侦测),就会通知JDO的状态管理器,从而做出相应的insert、update或delete动作持久化到数据库。

但是,最终,这些透明持久化方案还得和我们自己的DAO策略集合起来。持久化的最终结果是要将数据存入数据库中,DAO模式提供了一种更优雅的持久化解决方案(比起业务代码直接使用JDBC来说)。而如何实现DAO是一个重要的问题。DAO模式的最终目的,是为了将“与持久化相关的代码”从业务逻辑中分离出来。所以,如果是自己使用JDBC,做一个DAO——即使是很薄的那种——也是很有必要的,如同上面提到的那个例子。但既然有了Hibernate,iBATIS和JDO等等这样一些优秀的“透明持久化”方案,自己再去发明轮子可算不上明智。在实现DAO时,如果用到了这些开源方案,针对不同的方案实现自己不同的DAO,仍然是个好主意(如当使用Hibernate的时将其封装到自己的DAO里)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: