Hibernate是什么

 
Hibernate 是一个开源免费的、基于 ORM 技术的 Java 持久化框架。通俗地说,Hibernate 是一个用来连接和操作数据库的 Java 框架,它最大的优点是使用了 ORM 技术。

2001 年,27 岁的程序员 Gavin King 首次发布了 Hibernate。Gavin King 是一名来自澳大利亚的愤青,他非常厌恶当时流行的 EJB 框架,因为 EJB 框架的实体 bean 让数据库操作变得异常麻烦,于是他自己动手开发了一个符合 ORM 理论的 Java 框架,并于 2001 年 11 月首次发布,这个框架就叫 Hibernate。

2003 年 9 月,Gavin King 及其开发团队加入 JBoss 公司,开始全职开发 Hibernate,从此 Hibernate 获得了突飞猛进的发展和普及。

什么是 ORM?

ORM 是一种自动生成 SQL 语句的技术,它可以将对象中的数据自动存储到数据库中,也可以反过来将数据库中的数据自动提取到对象中,整个过程不需要人工干预,避免了手写 SQL 带来的麻烦。

学习 Hibernate 必须先了解 ORM,我们已经在上一节中详细介绍了 ORM 技术,不了解的读者请转到:ORM 是什么?

什么是持久化?

所谓持久化,就是将程序中的数据存储到数据库中。

程序必须加载到内存才能运行,程序运行过程中产生的数据也位于内存中,而内存是一种临时性存储介质,当程序关闭或者计算机断电后数据就会消失,为了让数据永久存储,必须将它们写入硬盘,而数据库就是数据在硬盘上的一种高效的存储和组织形式,非常便于数据的插入、删除、查找、更新等。

将程序中的数据写入数据库,数据就可以永久存储,不会随着程序的关闭而消失了,所以将这个过程称为数据的持久化。

Hibernate 支持的数据库

Hibernate 支持几乎所有主流的关系型数据库,只要在配置文件中设置好当前正在使用的数据库,程序员就不需要操心不同数据库之间的差异。

以下常见数据库都被 Hibernate 支持:
  • MySQL
  • Oracle
  • Microsoft SQL Server
  • DB2
  • PostgreSQL
  • FrontBase
  • Sybase

Hibernate 是一种全自动的 ORM 框架

Hibernate 是一款全自动的 ORM 框架。之所以将 Hibernate 称为全自动的 ORM 框架,这其实是相对于 MyBatis 来说的。

我们知道,ORM 思想的核心是将 Java 对象与数据表之间建立映射关系。所谓的映射关系,简单点说就是一种对应关系,这种对应关系是双向的:
  • 将数据表对应到 Java 对象上,这样数据表中的数据就能自动提取到 Java 对象中;
  • 将 Java 对象对应到数据表上,这样 Java 对象中的数据就能自动存储到数据表中。

MyBatis 虽然是一种 ORM 框架,但它建立的映射关系是不完整的。Mybatis 只能将数据表映射到 Java 对象上,却不能将 Java 对象映射到数据表上,所以数据只能从数据表自动提取到 Java 对象中,反之则不行。要想将 Java 对象中的数据存储数据表中,开发人员需要手动编写 SQL 语句,依然非常麻烦,这就是 MyBatis 被称为半自动 ORM 框架的原因。

与 MyBatis 相比,Hibernate 建立了完整的映射关系,它不仅能将数据表中的数据自动提取到 Java 对象中,还能自动生成并执行 SQL 语句,将 Java 对象中的数据存储到数据表中,整个过程不需要人工干预,因此 Hibernate 被称为全自动的 ORM 框架。

Hibernate 和 MyBatis 都是业界主流的 ORM 框架和持久层解决方案,但两者存在一些区别,详情请参考 MyBatis 和 Hibernate 的区别

Hibernate 提供了缓存机制

Hibernate 提供了缓存机制(一级缓存、二级缓存、查询缓存),我们可以将那些经常使用的数据存放到 Hibernate 缓存中。当 Hibernate 在查询数据时,会优先到缓存中查找,如果找到则直接使用,只有在缓存中找不到指定的数据时,Hibernate 才会到数据库中检索,因此 Hibernate 的缓存机制能够有效地降低应用程序对数据库访问的频次,提高应用程序的运行性能。

JDBC vs Hibernate

我们知道,JDBC 是 Java 领域中出现最早一种数据库访问技术,而 Hibernate 则是对 JDBC 的轻量级封装,它们都可以完成对数据库的增删改查(CRUD)操作,但两者存在以下差异,如下表。

区别 JDBC Hibernate
代码量 代码繁琐,开发成本较高。 代码精简,开发成本较低。
语言 JDBC 使用的是基于关系型数据库的标准 SQL 语句。 Hibernate 使用的是 HQL(Hibernate query language)语句。
操作的对象 JDBC 操作的是数据,将数据通过 SQL 语句直接传送到数据库中执行。 Hibernate 操作的是 Java 对象。Hibernate 使用了 ORM 思想,在 Java 对象与数据库表之间建立映射关系,通过操作 Java 对象来实现对数据库的操作。
缓存 JDBC 没有提供缓存机制。 Hibernate 提供了缓存机制(例如一级缓存、二级缓存、查询缓存),对于那些经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去数据库查询,缓存机制对提升性能大有裨益。
可移植性 JDBC 可移植性差,JDBC 中使用的 SQL 语句是以字符串的形式嵌入到代码中的,但不同数据库所使用的的 SQL 语法不尽相同,如果切换数据库(例如从 MySQL 数据库切换到 Oracle 数据库),需要修改大量代码。 Hibernate 可移植性好,能够屏蔽不同数据库之间的差异。当需要更换数据库时,通常只需要修改其配置文件(hibernate.cfg.xml)中的 hibernate.dialect(方言) 属性,指定数据库类型即可,Hibernate 会根据指定的方言自动生成适合的 SQL 语句。
读写性能 JDBC 是 Java 领域内性能最好的数据库访问技术。 Hibernate 性能较差。
可扩展性 JDBC 不具有可扩展性 Hibernate 框架开源免费,用户可以根据自身需要进行功能定制,具有良好的可扩展性。

Hibernate 和 JDBC 都是十分优秀的数据库访问技术,它们都各有优缺点,但两者不存在孰优孰劣的问题,我们只需要根据自身需求和应用场景选择即可。