Java持久层多项技术比较

1、 Hibernate

Hibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有。

它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate。

Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。

何时使用Hibernate

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

2、MyBatis (直接使用SQL)

MyBatis 的前身就是 iBatis 。是一个数据持久层(ORM)框架。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的 JPetStore实例。

何时使用iBATIS

MyBatis

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

3、JPA

Java Persistence API是Java EE 5平台上的标准的对象-关系映射和持久管理接口。作为EJB 3规范成果的一部分,它得到了所有主要的Java供应商的支持。Java Persistence API借鉴了诸如Hibernate、Oracle TopLink、Java Data Objects(JDO)以及EJB容器托管持久化等领先的持久性框架的想法。JPA提供了一个平台,持久性提供程序(persistence provider)可在该平台上获得使用。Java Persistence API的一个主要特性是任何的持久性提供程序都可以在上面做插拔。

JPA是一个基于POJO的标准的ORM持久化模型。它是EJB3规范的组成部分,代替了实体bean。实体bean被定义成EJB 2.1规范的一部分,但其作为一个完整的持久性解决方案却未能打动业界,主要是因为这几方面的原因:

Ÿ           实体bean是重量级组件且与Java EE服务器紧密耦合,这使得它们相比于轻量级的POJO来说更缺乏适应性,对于可重用性来说,POJO更加理想。

Ÿ           实体bean难以开发和部署。

Ÿ           BMP实体bean强制使用JDBC,而CMP实体bean则高度依赖Java EE服务器的配置和ORM声明,这些限制将会影响到应用的性能。

为了解决这些问题,EJB 3软件专家组制定了JPA,其作为JSR220的组成部分。JPA从其他的持久化技术那里借用了最好的想法,其为所有的Java应用定义了一个标准的持久化模型。JPA既可用作Java SE应用也可用作Java EE应用的持久化解决方案。

JPA使用元数据注解和/或XML描述符文件来配置应用领域中的Java对象和关系数据库中的表之间的映射。JPA是一个完整的ORM解决方案,并且支持继承和多态。它还定义了一种类SQL的查询语言:JPQL(Java Persistence Query Language),该种语言不同于EJB-QL(EJB Query Language),EJB-QL是由实体bean使用的一种语言。

使用JPA,你就可以插入任何实现了JPA规范的持久性提供程序,而不是随Java EE容器一起提供的缺省的持久性提供程序是什么就用什么。例如,GlassFish服务器使用Oracle提供的TopLink Essentials作为它的缺省持久性提供程序,但是你可以通过在应用中包含所有必须的JAR文件来选择使用Hibernate作为持久性提供程序。

何时使用JPA

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

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

(比较 MyBatis,Hibernate,JPA

支持的查询语言

MyBatis大力支持SQL,而HibernateJPA则是使用它们自己的查询语言(分别是HQLJPQL),这些语言与SQL类似。

性能

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

简易性

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

完整的ORM解决方案

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

对SQL的依赖

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

支持的查询语言

Mybatis大力支持SQL,而HibernateJPA则是使用它们自己的查询语言(分别是HQLJPQL),这些语言与SQL类似。

跨不同数据库的移植性

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

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

社区支持和文档

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

跨非Java平台的移植性

iBATIS支持.NetRuby on RailsHibernateNHibernate的形式为.Net提供了一个持久性解决方案。JPA,作为特定于JavaAPI,显然并不支持任何的非Java平台。

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

 

表1. 持久性解决方案比较

特性

Mybatis

Hibernate

JPA

简易性

完整的ORM解决方案

一般

对数据模型改变的适应性

一般

一般

复杂性

一般

一般

SQL的依赖

一般

一般

性能

不适用*

跨不同关系数据库的移植性

一般

不适用*

Java平台的移植性

不支持

社区支持和文档

一般

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


4、DbUtils

原则上这不能说是一个持久层框架,它提供了一些Jdbc的操作封装来简化数据查询和记录读取操作。本站就是采用这个项目来读写数据库,代码非常简洁,如果你厌烦了Hibernate的庞大,不妨可以试试——DbUtils。

给出一小段代码看看DbUtils是怎么用的:

QueryRunner run = new QueryRunner(dataSource); // Use the BeanHandler implementation to convert the first
// ResultSet row into a Person JavaBean. ResultSetHandler h = new BeanHandler(Person.class); // Execute the SQL statement with one replacement parameter and
// return the results in a new Person object generated by the BeanHandler. Person p = (Person) run.query("SELECT * FROM Person WHERE name=?", "John Doe", h); 
5、 Guzz (3年没有更新了(至今2015年5月3日23:14:38))

Guzz 是一种用来进行快速开发和高性能网站设计的框架,用于替代或者补充hibernateibatis的持久化实现,并提供更多的大型系统架构设计 支持。guzz的目标是使得大型化网站设计更加简单,团队分工更加明确,框架在使用时更少出问题。主要设计理念:

  • 更容易的团队管理和人员分工
  • 现代大规模系统设计
  • 支持像hibernate一样的对象持久,映射和方便的增删改查
  • 支持像ibatis一样,让dba参与sql设计的复杂数据库操作和优化
  • 支持大量的数据库和主从分离
  • 支持数据表在多组机器中水平分布(Shard)
  • 组件化服务(SOA),构建企业基础服务平台
  • 提高xx%倍效率的快速开发
  • 支持配置管理服务器,对所有应用程序的配置进行统一管理

猜你喜欢

转载自blog.csdn.net/ydonghao2/article/details/45462991