前言
本章我们将带领大家入门Hibernate持久层框架。
Hibernate介绍和环境搭
Hibernate 框架简介
- Hibernate框架介绍
Hibernate是数据持久化工具,也是一个开放源码的ORM解决方案。Hibernate内部封装了JDBC访问数据库的操作,向上层提供面向对象的数据访问API。 - Hibernate是ORM解决方案
基于ORM,Hibernate在对象模型和关系数据库的表之间建立一座桥梁,通过Hibernate,程序员不需要使用SQL语句操作数据库中的表,使用API直接操作JavaBean对象就可以实现数据库存储,修改,查询和删除等操作。、
Hibernate框架的优点和缺点
1. 优点
- . Hibernate功能强大,Java应用与关系数据库之间的桥梁,和JDBC方式比较,代码量大大减少,提高持久化代码的开发速度 ,降低维护成本。
- Hibernate支持很对面向对象特征,如组合继承多态等。使开发人员不必再面向对象领域的对象模型和面向数据库关系模型之间来回切换,方便开发人员进行领域驱动的面向对象的设计与开发。
- 可移植性好。
- Hibernate框架开源免费,可以在需要研究源代码,改写源代码,进行功能的指定,具有可扩展性。
2. 缺点
- 不适合以数据为中心大量使用存储过程的应用。
- 大规模的批量插入,修改和删除,不适合用Hibernate
Hibernate和MyBatis比较
1. 简介Hibernate和Mybatis
-
Hibernate:Hibernate是当前最流行的ORM框架之一,对JDBC提供了较为完整的封装。Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL的自动生成和执行。
-
Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于 POJO 与 SQL 之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO 。相对Hibernate“O/R”而言,Mybatis 是一种“Sql Mapping”的ORM实现。
2. 数据库移植性
-
Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。
-
Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。
3.总结一下他们的区别
我们将Mybatis和Hibernate之间的区别自个用六个词做总结:
Mybatis:小巧、方便、高效、简单、直接、半自动化
Hibernate:强大、方便、高效、复杂、间接、全自动化
Hibernate环境搭建
- 下载JAR文件(Maven导入依赖)
- 部署JAR文件
- 创建Hibernate配置文件 hibernate.cfg.xml
- 创建持久化类和映射文件
使用Hibernate完成持久化操作
Hibernate操作数据库的步骤
- 读取并解析配置文件及映射文件
- 依据配置文件和映射文件中的信息,创建SessionFactoty对象。
- 打开session
- 开启事务
- 数据库操作
- 结束事务
- 关闭session
使用Hibernate实现按住键查询
-
在进行 修改或者删除操作时,先加载对象,在执行修改或者删除操作。 Hibernate提供两种方法按照主键加载对象。
Object get(Class clazz,Serializable id); Object load(Class clazz,Serializable id);
-
虽然两个方法都可以加载对象,对比两者的区别:
- 当时用 Session的 get() 方法时,如果数据不存在,get会返回一个null。
- 但是使用load 方法的时候,若加载的数据不存在,则会抛出异常;这只是区别之一,后续还会讲到其它区别。
使用Hibernate实现数据库增,删,改
Hibernate中Java对象的三种状态
Java对象的三种状态
Hibernate对象有三种状态,分别是:瞬时态(Transient)、 持久态(Persistent)、游离态(Detached)。
1. 瞬时状态
- 瞬时状态又称为临时状态。如果Java对象与数据库中的数据没有任何关联,即 此Java对象在数据库中没有相关联的记录,此时的Java对象中状态为瞬时状态。Session对于瞬时状态的Java对象是一无所知的,当对象不再被引用,它的所有数据也就丢失,对象会被Java虚拟机按照垃圾回收机制处理。
2. 持久状态
- 当对象与Session关联,被Session管理时,他就处于持久状态。
3. 游离状态
- 脱离状态又称为脱管状态。处于持久状态的对象,脱离与其关联的Session的管理后,对象就处于游离状态。处于游离状态的对象,Hibernate无法保证对象所包含的数据与数据库中的记录一致,因为Hibernate已经无法感知该对象的任何操作。
三种状态之间的转换
-
瞬时状态转为持久状态
使用Session的save(),saveOrUpdate(),等方法保存对象后,该对象的状态由瞬时转换为持久。
使用Session的get()和load()方法获取对象,该对象的状态为持久状态。 -
持久状态转换为瞬时状态
执行Session的delete()方法后,对象有原来的持久状态变为瞬时状态,因为此时该对象没有与任何数据库数据关联。 -
持久状态转换为游离状态
执行Session的evict(),clean()或close()方法,对象由原来的持久状态转换为游离状态。 -
游离状态转换为持久状态
执行Session的update()或saveOrUpdate()方法,对象由游离状态转换为持久状态,该对象再次与当前Session相关联。 -
游离转换为瞬时
执行Session的delete()方法,对象由游离状态转化为瞬时状态。
脏检查及刷新机制
脏检查
当事务提交时,Hibernate会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变,这种判断称为脏检查
刷新机制
当Session缓存中对象的属性每次发生变化时,Session并不会立即刷新缓存和执行相关的SQL语句,而是在特定时间点才刷新缓存
默认情况下,Session会以以下时间刷新缓存机制
- 应用程序显示调用flush()方法时。
- 应用程序调用Transaction的commit()方法时。
更新数据的方法
- update():将游离状态的对象恢复为持久状态,同时进行数据库的更新操作。当参数的对象OID为null时汇报异常。
- saveOrUpdate():同时包含save()和Update()方法的功能,如果入参为瞬时状态的对象,就调用save(),如果入参为游离状态。
- merge():能够把 作为参数传入的游离对象的属性复制到一个拥有相同OID持久状态对象中,通过对持久状态对象的脏检查实现更新操作,并返回持久状态对象。如果无法从Session缓存或者数据库中加载到响应的持久状态对象,即传入的瞬时对象,则创建其副本执行插入操作,并返回新的这一持久对象。