iBATIS、Hibernate、JPA 比较

iBATIS、Hibernate、JPA:谁最适合你?

-ORM(对象关系映射)解决方案比较

作者: K. L.Nitin, Ananya S., Mahalakshmi K., and S.angeetha, 

2008年7月15日发表于JavaWorld.com

原文地址:http://www.javaworld.com/javaworld/jw-07-2008/jw-07-orm-comparison.html?page=1

 

摘要:

Java中的ORM(对象关系映射)是一件复杂的事情,自从新一代的ORM解决方案出现以后,人们对于JDBC和实体bean的热情不如从前那样高涨了。这些ORM工具使得编程更为容易,为面向对象编程思想和多层体系结构的开发提供了更好的支持。从对查询语言支持、性能和跨数据库可移植性几个方面,我们来了解Hibernate, iBATIS和java持久性API.

 

本文介绍和比较了两种最为流行的开源持久性框架:iBATIS Hibernate,同时介绍了JPA(java持久性API).本文对各种解决方案做了一个介绍,探讨他们定义性的特征,以及在广泛的实际应用场合中各自的优点和缺点。从性能、可扩展性、复杂程度以及对数据模型变化的适应性方面,本文对iBATIS, Hibernate, 和JPA进行了比较。

如果你对持久性概念不太清楚,本文可以作为这些概念以及各种流行的开源持久性解决方案的入门。如果你已经熟悉了以上三种解决方案,只是想看看它们之间的简明比较,请参见“持久性技术比较”这一章节。

了解持久性

数据具有持久性的属性,以确保其在应用程序的生命周期结束之后依然可用。对于面向对象的语言(如Java)而言,持久性保证在创建对象的应用程序结束执行之后,依然可以获取该对象的状态。

要确保数据的持久性,有几种不同的方法。传统的方法是将需要的信息存储在文件系统中,这些文件不记录相互之间的关系。由于数据分散在不同的文件中,用这种方法管理大量数据会遇到困难。采取这样的文件系统,同样的信息在不同的文件中重复存在,如何确保数据的一致性也是一个问题。数据的检索相当地耗费时间,尤其是这些文件没有排序的情况下。此外,文件系统对于并发访问的支持有限,也不能确保数据的完整性。由于上述原因,用文件系统来存储数据并不是解决持久性问题的好方法。

时至今日,大量数据通常使用数据库来存储。数据库分为多种类型:关系型数据库、层次型数据库以及面向对象的数据库等等。这些数据库以及各自的数据库管理系统(DBMSs),不仅提供持久性的支持,还管理所存储的信息。关系型数据库的使用最为广泛,关系型数据库是一系列相关联表格的集合。

企业级应用使得多层体系得到普通使用,多层体系结构通过将应用程序分为表示层、业务逻辑层和数据访问层,来提高程序的可维护性。持久层将业务逻辑与数据库代码分离开来,使得应用程序独立于底层数据库技术。有了强大的持久层,程序员不再需要关注数据的持久化,从关系型数据库读取和存储数据都被封装起来了。

Java应用程序传统上采用JDBC (Java DatabaseConnectivity)API将数据持久化到关系型的数据库中。JDBC API使用SQL语句来完成增删改查(CRUD)的操作。JDBC代码嵌入到java类中,换而言之,JDBC代码与业务逻辑层紧密关联。这些代码严重依赖于SQL,而不同的数据库之间SQL语句会有差别,应用程序要从一个数据库迁移到另外的数据库非常困难。

关系型数据库技术强调数据以及之间的关系,然而,java面向对象规范关注的不是数据本身,而是数据所执行的操作,这两方在关注点上存在冲突。同时,面向对象编程概念中的继承、多态和关联在关系型数据库中无法表达。这种不匹配还会带来另外一个问题:java应用程序中的自定义数据类型得不到数据库的支持,无法进行映射。

比较持久化技术

这些框架中的每一种都有自己的优点和缺点。让我们来考虑几个参数,这些参数可帮助你确定其中满足你需求的最佳可行方案。

简易性

在许多应用的开发中,时间是主要的制约因素,特别是当团队成员需要经培训来使用某种特定框架的时候。在这类情形中,iBATIS是最好的选择,该框架是三种框架中最简单的,因为它仅需SQL方面的知识就够了。

完整的ORM解决方案

HibernateJPA一类的传统的ORM解决方案应该用来作为一种完全的对象-关系映射手段。HibernateJPA直接把Java对象映射到数据库表上,而iBATIS则是把Java对象映射到SQL查询的结果上。在某些应用中,领域模型中的对象是根据业务逻辑来设计的,可能不完全与数据模型匹配,在这种情况下,iBATIS是合适的选择。

对SQL的依赖

总是会存在精通Java的人和更信任SQL的人这样的一种划分,对于一个熟练的Java程序员来说,他想使用一个无需与SQL有太多交互的持久性框架,那么Hibernate是最好的选择,因为它会在运行时生成高效率的SQL查询。但是,如果你想要使用存储过程来对数据库查询做各方面的控制的话,则iBATIS是推荐的解决方案。JPA还可通过EntityManager的createNativeQuery()方法来支持SQL。

支持的查询语言

iBATIS大力支持SQL,而Hibernate和JPA则是使用它们自己的查询语言(分别是HQL和JPQL),这些语言与SQL类似。

性能

一个应用要成功的话需要具备良好的性能。Hibernate通过提供缓存设施来提高性能,这些缓存设施有助于更快地从数据库中检索数据。iBATIS使用SQL查询,这些查询可通过微调来获得更佳性能。JPA的性能则取决于供应商的实现,根据每个应用的特有情况做选择。

跨不同数据库的移植性

有时候,你需要改变应用使用的关系数据库,如果你使用Hibernate来作为持久化解决方案的话,那么这一问题很容易解决,因为Hibernate在配置文件中使用了一个数据库方言属性。从一个数据库移植到另一个数据库上仅是把dialect属性修改成适当值的事。Hibernate使用这一属性来作为生成特定于某种给定数据库的SQL代码的指南。<span>

如前所述,iBATIS要求你编写自己的SQL代码,因此,iBATIS应用的可移植性取决于这些SQL。如果查询是使用可移植的SQL编写的话,那么iBATIS也是可在不同的关系数据库之间做移植的。另一方面,JPA的移植性则取决于其正在使用的供应商实现。JPA是可在不同的实现之间做移植的,比如Hibernate和TopLinkEssentials之间。因此,如果应用没有用到某些提供商特有的功能特性的话,那么移植性就不是什么大问题。

社区支持和文档

在这方面,Hibernate明显是个赢家。存在许多以Hibernate为焦点的论坛,在这些论坛中社区成员都会积极地回答各种问题。关于这一点,iBATIS和JPA正慢慢赶上。

跨非Java平台的移植性

iBATIS支持.Net和Ruby onRails。Hibernate以NHibernate的形式为.Net提供了一个持久性解决方案。JPA,作为特定于Java的API,显然并不支持任何的非Java平台。

表1给出了这一比较的一个总结。

 

1.持久性解决方案比较

 

特点

iBATIS

Hibernate

JPA

简单易用

良好

良好

完整的ORM解决方案

平均

适应数据模型变化的能力

良好

平均

平均

复杂性

平均

平均

对SQL的依赖

良好

平均

平均

性能

不确定*

跨数据库移植能力

平均

不确定*

对非Java平台的支持

良好

不支持

社区和文档支持

平均

良好

良好

*JPA对这些特性的支持取决于持久性提供程序,最终的结果可能会视情况各异。

结论

iBATIS、Hibernate和JPA是用于把数据持久到关系数据库中的三种不同的机制,每种都有着自己的优势和局限性。iBATIS不提供完整的ORM解决方案,也不提供任何的对象和关系模型的直接映射。不过,iBATIS给你提供了对查询的全面控制权。Hibernate提供了一个完整的ORM解决方案,但不提供对查询的控制权。Hibernate非常的受欢迎,有一个庞大而活跃的社区为新用户提供支持。JPA也提供一个完整的ORM解决方案,并提供对诸如继承和多态一类的面向对象编程特性的支持,不过它的性能则取决于持久性提供程序。



原文地址: http://blog.sina.com.cn/s/blog_5ce9f5040100euup.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值