数据持久层框架iBatis, Hibernate 与 JPA 比较

在本文中我们介绍并比较两种最流行的开源持久框架:iBATISHibernate,我们还会讨论到Java Persistence API(JPA)。我们介绍每种解决方案并讨论其所规定的品质,以及在广泛的应用场景中其各自的长处和缺点。然后我们会基于诸如性能、移植性、复杂性以及对数据模型改变的适应性等因素来比较iBATIS、Hibernate和JPA。

如果你是一个刚起步的Java程序员,新接触持久性概念的话,那么就把阅读此文当作是接受一次这一主题以及大部分流行的开源持久性解决方案的启蒙。如果你对这三种解决方案都很熟悉,并且只想要一个简单的比较的话,那么你会在“比较持久化技术”一节中找到相应的内容。

理解持久性

持久性(persistence是数据的一个属性,其确保即使是在应用的生命周期之外数据也是可用的。对于像Java这样的面向对象语言来说,持久性确保了即使是在创建对象的应用停止执行之后对象的状态仍是可访问的。

存在多种实现持久性的方法。传统的解决这一问题的方法是使用文件系统来把需要的信息存储在平面文件(flat file)中。这一方法很难用来管理大量的数据,因为数据分布在不同的文件中。使用平面文件系统的话维护数据的一致性也是一个问题,因为相同的信息可能会被重复放在各个文件中。在平面文件中查找数据很耗时,特别是如果这些文件还未排序的话。还有,文件系统对并发访问的支持有限,因为它们不能确保数据的完整性。基于上述种种原因,在寻求持久性时,文件系统并不被视为一个良好的数据存储解决方案。

当前最常见的方法是使用数据库,其充当巨大量数据的存储库。存在许多种类型的数据库:关系型的、层次结构型的、网络型的、面向对象型的等等。这些数据库,以及它们的数据库管理系统(DBMS),不仅提供持久性能力,而且管理其所持久的信息。关系数据库是最被广泛使用的类型,关系数据库中的数据被建模成一组相互关联的表。

企业级应用的出现普及了n层架构,其目的是通过把表现、业务和数据库相关代码分离到应用的不同层级(或是层面)中来提升可维护性。分离了业务逻辑和数据库代码的层面即是持久层,其保持了应用相对于底层的数据库技术的独立性。适当的位置上有了这一强健的层面,开发者就不再需要操心数据的持久性。持久层封装了存储和检索关系型数据库中的数据的方式。

Java应用传统上使用JDBC(Java Database Connectivity)API来把数据持久到关系数据库中。JDBC API使用SQL语句来完成创建(create)、读取(read)、更新(update)和删除(delete)(CRUD)操作。JDBC代码内嵌在Java类中——换句话说,这类代码与业务逻辑紧密耦合在一起。这类代码还在很大程度上依赖于SQL,而SQL并非是跨数据库的标准;这使得从一种数据库移植到另一种数据库变得困难起来。

关系数据库技术强调的是数据及其之间的关系,而用于Java中的面向对象范式却并非关注数据本身,而是关注执行于数据之上的操作。因此,当这两种技术需要携手合作时,就会存在利益冲突。而且,关系数据库并不能满足继承、多态及关联这些面向对象编程概念。当Java应用中的用户定义的数据类型被映射到关系数据库上时,由这一失配导致的另一个问题就出现了,因为后者并没有提供所需的类型支持。

对象关系映射

对象关系映射(object-relational mapping,ORM)已成为了有时被称作对象关系阻抗失配(impedance mismatch)的这一问题的一个解决方案。ORM是一种透明地把应用对象持久到关系数据库中的表的技术。ORM的行为就像是一个虚拟的数据库,对用户隐藏了底层的数据库架构。ORM提供功能来执行完整的CRUD操作并鼓励面向对象的查询。ORM还支持元数据映射以及在应用的事务管理方面提供帮助。

举个例子有助于说明ORM是如何工作的。考虑一个需要持久到数据库中的简单的Car对象,领域模型中的这一Car对象是数据模型中的CAR表的表现形式。Car对象的属性派生自CAR表的各列。在Car类和CAR表之间存在一个直接映射。

存在许多开源的ORM工具,其中包括Hibernate、iBATIS SQL Maps以及Java Ultra-Lite Persistence等。这些工具大多数是提供Java应用和数据库之间的抽象层的持久性框架。持久性框架把应用领域中的对象映射成需要持久在数据库中的数据,这些映射可使用XML文件或是元数据注解(后者作为Java1.5的组成部分被引入到语言中)来定义。持久性框架的目的是分离数据库相关代码和应用代码(即业务逻辑),从而提高应用的灵活性。持久性框架通过提供一个持久性逻辑的包装器来简化开发过程。

完成了持久性的基本介绍之后,我们就做好了继续讨论两种最流行的开源持久框架iBATIS和Hibernate的准备。我们还会介绍Java Persistence API,并讨论这三种解决方案在各种应用场景中的优势和弱点。

何时使用iBATIS

iBATIS最好是用在你需要全面地控制SQL的时候,在需要对SQL查询做微调的时候也很有用。当你在应用和数据库设计两方面都有完全的控制权的时候,就不应该使用iBATIS,因为在这样的情况下,应用可能会做出修改以适应数据库,或是反过来。在这种情形中,你可以构建一个完全的对象-关系应用,其他的ORM工具更适于使用,因为iBATIS较为以SQL为中心,其通常被称作反转的——功能齐全的ORM工具生成SQL,而iBATIS直接使用SQL。iBATIS也不适合于非关系型的数据库,因为这类数据库不支持事务和其他iBATIS用到的键特性。

何时使用Hibernate

Hibernate最适合用来作为端到端的OR映射的手段。其提供了一个完整的ORM解决方案,但但是不会让你控制查询。对于那些对应用和数据库两者都有完全的控制权的情况来说,Hibernate是一种理想的解决方案。在这类情况中,你可以修改应用来适用数据库,反之亦然,在这些情况下你可以使用Hibernate来构建一个全对象-关系应用。对于不太熟悉SQL的面向对象编程者来说,Hibernate是最佳选择。

何时使用JPA

JPA应该用在需要标准的基于Java的持久性解决方案的时候。JPA支持继承和多态这两种面向对象编程特性。JPA的缺点是其需要一个实现了其自身的提供程序。这些供应商特有的工具还提供了某些并未定义成JPA规范组成部分的特性,其中一个这样的特性是缓存支持,该功能并未在JPA中做明确定义,但其中一个最流行的实现了JPA的框架Hibernate对这一功能提供了很好的支持。

此外,JPA被定义成只能在关系数据库上工作。如果你的持久化解决方案需要扩展到其他类型的数据存储上,比如XML数据库上的话,则JPA就不能够用来解决你的持久性问题了。

 

比较持久化技术

现在你已经分析了三种不同的持久化机制及其运作方式。这些框架中的每一种都有自己的优点和缺点。让我们来考虑几个参数,这些参数可帮助你确定其中满足你需求的最佳可行方案。

简易性

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

完整的ORM解决方案

像Hibernate和JPA一类的传统的ORM解决方案应该用来作为一种完全的对象-关系映射手段。Hibernate和JPA直接把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代码的指南。

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

社区支持和文档

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

跨非Java平台的移植性

iBATIS支持.Net和Ruby on Rails。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解决方案,并提供对诸如继承和多态一类的面向对象编程特性的支持,不过它的性能则取决于持久性提供程序。

某个特定持久性机制的选择事关所有功能特性的权衡,这些特性在本文的比较章节中都做了讨论。对于大部分的开发者来说,需要根据是否要求对应用的SQL做全面控制、是否需要自动生成SQL,或仅是想要一个易于编程的完整的ORM解决方案等各方面的考虑来做决定。

时间: 2024-08-05 21:38:20

数据持久层框架iBatis, Hibernate 与 JPA 比较的相关文章

Hibernate: 数据持久层框架

Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有.基于LGPL V2.1协议发布. 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来.无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate. Hibernate不仅负

Java数据持久层框架 MyBatis

MyBatis 详细介绍 MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的 JPetStore实例. 源码来源:minglisoft.cn/technology

Java数据持久层框架 MyBatis之背景知识二

对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习是最好的办法.J 一.概述 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) iBATIS框架 二.历史变迁 MyBatis 本是apache的一个开

一、持久层框架(Hibernate)一

一.Hibernate 使用JDBC做数据库相关功能开发会做很多重复性的工作,创建连接,关闭连接,把字段逐一映射到属性中等.Hibernate把这些进行封装起来,使得数据库访问变得轻松简单. 1.创建数据库,数据表 --创建数据库 create database test; --使用数据库 use test; --创建数据表 CREATE TABLE product_table ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(30) , pr

三、持久层框架(Hibernate)

一.Hibernate处理关系 关系主要有三种:1.多对一 2.一对多 3.多对多 1.多对一 一个Product对应一个Category,一个Category对应多个Product(一个产品对应一个类别,一个类别对应多个产品) 也就是Product和Category是多对一的关系.(多个产品对应一个类别) 1.1在数据test下创建表category_table,两个字段,id(自增),字符串格式name 其实也不用建表,因为Hibernate会自动建表. use test;   CREATE

数据持久层

1.数据持久化 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称. 数据模型可以是任何数据结构或对象模型, 存储模型可以是关系模型.XML.二进制流等. cmp和Hibernate只是对象模型到关系模型之间转换的不同实现. 数据持久化的好处: 1.程序代码重用性强,即使更换数据库,只需要更改配置文件,不必重写程序代码. 2.业务逻辑代码可读性强,在代码中不会有大量的SQL语言,提高程序的可读性. 3.持久化技术可以自动优化,以减少对数据库的访问量,提高程

持久层框架JPA与Mybatis该如何选型

一.现状描述 目前java 持久层ORM框架应用最广泛的就是JPA和Mybatis.JPA只是一个ORM框架的规范, 对该规范的实现比较完整就是Spring Data JPA(底层基于Hibernate实现),是基于Spring的数据持久层框架,也就是说它只能用在Spring环境内.Mybatis也是一个优秀的数据持久层框架,能比较好的支持ORM实体关系映射.动态SQL等. 笔者在学习这两个框架的过程中,看过不少的帖子,每当有帖子比较这两个框架的优缺点,就引来一场论战.从笔者的角度,为什么国内的

Rexdb:高性能的数据持久层(ORM)框架

Rexdb是一款使用Java语言编写的,开放源代码的数据持久层框架(腾云科技ty300.com).提供了查询.更新.批处理.调用.(JTA)事务.数据源管理等功能,可以取代Mybatis.Hibernate作为系统的核心ORM框架(基础教程qkxue.net). Rexdb提供了工具类风格的接口,不需要编写映射配置,使用简便:同时,它还具备同类框架中最高效的执行效率. Rexdb的某次性能测试结果为:查询性能是Hibernate的2.3倍,Mybatis的1.7倍.

数据持久层(二)

在对象-关系数据库之间提供一个成功的企业 级映射解决方案,尽最大可能弥补这两种范例之间的差异. 持久就是对数据的保持,即对程序状态的保持.通常通过数据库实现持久层是把数据库实现这块当作一个独立逻辑拿出来.说白了,就是数据库程序是在内存中的,为了使程序运行结束后状态得以保存,就要保存到数据库使用ORM(对象关系数据库映射)技术可以避免代码直接操作数据库,增加可移植性,可扩展性,可维护性. J2EE 的三层结构是指表示层( Presentation ),业务逻辑层( Business Logic )