1. 前言
Hibernate 神奇之处在于只需要简简单单的几行代码,就能完成原生 JDBC 中复杂的操作。
本节课程的主要知识点:
- 初步认识、了解 Hibernate 核心组件各自的基础功能;
- 编写 Hibernate 程序的流程。
2. Hibernate 核心组件
独木难成林,一个好汉三个帮!
开发者的应用程序依赖 Hibernate 完成数据库中数据操作任务时,Hibernate 又会依靠它体系内的多个组件一起协同完成任务。
如下图展示了 Hibernate 的核心组件库中部分组件之间的依赖关系。
开发者需要使用 Hibernate 暴露给开发者的组件 API 进行对接开发,先看看分别都有谁:
- Configuration;
- ServiceRegistry;
- SessionFactory;
- Session;
- Transaction。
这几大组件各有来头,想要完全驾驭,则需了解其秉性和功能,后面章节会一一展开讨论。此处只需要了解这几大组件在构建一个完整的操作流程时各自的核心作用及出现顺序。
如下图示:
简述一下流程:
-
通过 Configuration 对象读取主配置文件,故需为此对象指定主配置文件的位置,如不指定,由从默认位置即编译后的主目录(classes 或 bin)中读取;
-
配置对象在拥有了数据库连接配置信息后便可以创建 SessionFactory 对象。此组件可认为是应用程序中对某一个具体关系型数据库系统的抽象引用。透明地认为它就是数据库的镜像;
-
由 SessionFactory 对象创建出可以直接操作数据库的会话对象(Session)。Session 对象相当于原生 Jdbc 中的 Connection 对象,但比其具有更丰富的实际操作功能,Session 对象也叫做持久化容器。应用程序主要使用此对象进行一系列具体的数据操作,有它便可“扫货”数据库中的数据;
-
Transaction 在具体操作中起事务监控作用,负责及时提交,及时刹车回滚。
认识了 Hibernate 中的这群肝胆相照的好兄弟,了解了他们的各自职责,它们通过分工合作的方式把应用程序的意图向 Hibernate 内部组件逐层传达。现在是着手编写一个完整代码的时候了,有了结果的过程更能感受到 Hibernate 的魅力。
Hibernate 4.x 之后的版本中多了一个 ServiceRegistry组件,此组件到后面章节论述。
3. 编写 Hibernate 程序
本文程序开发环境说明:
- 操作系统: windows 7 以上;
- 开发工具: Eclipse 。
此方案可作为学习者的可选择方案之一,有兴趣可了解其它系统或开发工具!
3.1 程序开发流程
新建一个 Java Project 项目,想必此处不需要更多累赘说明。
程序中需要使用 Hibernate 组件所提供的功能,因此程序中需要加入 Hibernate 的各组件所在的 Jar 包。
依赖包的加入方式有 2 种:
- 使用 Maven 的依赖管理功能自动加入,需要 Maven 相关知识,此文不介绍,需要了解可自行查阅相关资料;
- 手工方式加入,辛苦着并快乐着。
本课程采用第 2 方式,手工加入:
- 下载: Hibernate-release-4.2.0.Final.zip;
小插曲:为什么选择 4.x 版本?
企业只会选择市场上运行时间较久、稳定性经过时间检验的版本,4.x 版本已经出现一些时间,称得上较稳定版本,将来进入企业可直接上手。
高版本封装度高,从应用角度讲,只会更简单,从学习角度讲,不便于了解更多过往操作细节。
官网:Hibernate. Everything data.
- 解压: 找到解压后 Hibernate 目录下的 lib 子目录,从其中选择程序需要的基础包。切记别忘记加入 MySql Jdbc 驱动包(本文使用 MySql 相关的 Jdbc 驱动包)
友情提示时间:
- 把 Student.java 文件和 Student.hbm.xml 最好放在一起,不放在一起问题也不大。但两个文件构成了逻辑上持久化对象描述,既然是手足兄弟放在一起可加深情感上的联系。
- 把 Hibernate.cfg.xml 放在src下,运行时会编译到 classes 或 bin 目录下,此处为加载主配置文件的默认位置。
思考时间:Hibernate.cfg.xml 不放在 src 下可不可以?
用 Java 语言复述一下上面的中文描述流程:
// 配置对象
Configuration configuration = new Configuration().configure();
// 服务注册
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
// 会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
// 会话对象
Session session = sessionFactory.openSession();
// 事务对象
Transaction transaction = null;
try {
// 启用事务
transaction = session.beginTransaction();
//各种增、删、改、查…… 操作
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
session.close();
}
一定要细心观察啦!发现没有!使用Hibernate对数据库进行一系列操作也是一个模板化流程。
友情提示时间:
- 不使用 ServiceRegistry 对象,configuration.buildSessionFactory() 形式也可以创建会话工厂!(官方文档就这么创建的);
- 如果使用 ServiceRegistry,则需要注意上面的语法使用要点!否则有可能会出现配置信息读不到,会话工厂创建不成功的情况;
- 最后不要忘记关闭会话对象(Session)。
3.2 插入一条数据试试
在进行数据库中对应表中数据的 CRUD 之前,需要保证数据库中有对应的表结构。
Hibernate 为了让我们更专心于测试、了解操作流程及规范,避免开发者因切换不同的工作环境而影响思维惯性,提供了一个很好玩的功能!
利用 PO 对象信息自动在数据库系统中生成和 PO 对象类结构相似的表结构,是不是酷得不要不要的。大家一起来膜拜下!
要使用此功能,则只需要在 Hibernate.cfg.xml 主配置文件中添加如下一行
<property name="hbm2ddl.auto">create</property>
好!开始向 MySql 的 mystus 数据库中的 student 表中插入一条数据吧。
切记,此时数据库中还没有 student 表,更谈不上有数据。但是!奇迹马上就要发生。
// 配置对象
Configuration configuration = new Configuration().configure();
// 服务注册
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
// 会话工厂
SessionFactory sessionFactory =configuration.buildSessionFactory(serviceRegistry);
// 会话对象
Session session = sessionFactory.openSession();
// 事务对象
Transaction transaction = null;
try {
// 打开事务
transaction = session.beginTransaction();
//添加一条学生信息
Student student=new Student(1, "hibernate01","男");
session.save(student);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
session.close();
}
运行上述代码,再利用可视化工具进入 MySql 系统中查看一下,则会看到上面代码所产生的结果!
表和数据都已经存在了,是不是一件令人开心的事情呢!
高兴之余可别忘记下面的建议!
- 如果希望保留每一次添加的数据,则除了第一次 hbm2ddl.auto 属性的值为 create 外,后继需要改成 update 或 validate;
create 只要加载配置文件便会删除表,再创建表,周而复始!
update 或 validate 只有当 PO 对象类结构修改后才会触发表结构的变化
- 建议 hbm2ddl.auto 的功能只用于学习 Hibernate 的过程中,数据库设计由专业数据库需求设计师考虑为好。
4. 小结
本章节内容就要结束了,但学习之路才刚刚开始。
本章节认识了 Hibernate 的核心组件,并了解了 Hibernate 的具体操作流程。并把一条数据从应用程序中插入到了 MySql 中的表中。感受 Hibernate 神奇之时,更需要思考 Hibernate 又是如何做到的。
另外,本节内容虽然选择的是 MySql 数据库,但并不意味着你不可以选择其它数据库。
路漫漫其修远兮,吾将上下而求索,下节课程一起继续相逢在Hibernate 的江湖!