今天做了什么:
因为小课堂要被老大查房 ,所以格外认真准备Hibernate..
Hibernate

(什么是框架)
什么是Hibernate:
1.是应用在JavaEE三层结构中的持久层框架(什么是持久层),实现crud操作
2.底层是对jdbc的封装(封装jdbc的好处 ; 不需要写sql语句)
3.是开源轻量级(依赖少,开箱即用)框架
Hibernate版本 : 3.x ; 4.x ; 5.x
其中4.x已很少使用,因为是过渡版本.
如果不需要写sql, hibernate是如何实现的? > ORM思想
> Object Relationship Mapping 对象关系映射 ,实现步骤 :
1. 让实体类和数据库表对应
2. 让实体类属性与数据库表字段对应
3. 不需要直接操作数据库表,直接操作对应实体类
(画图描述,先讲jdbc步骤,缺点 > Hibernate)
如何实现映射? 通过配置文件
如何操作实体类? 通过Hibernate封装的对象 Session
代码实战:
使用步骤:
1. 导入所需依赖.
2. 创建实体类, 建表(此步可省,设置后Hibernate能自动生成)
3. 映射配置文件 (直接上代码)
<class>标签 name,table属性
配置实体类id和表id对应(Hibernate要求实体类有一个属性唯一值,要求表有字段作为唯一值), 配置数据库表id生成策略
再配置其他属性
4. Hibernate核心配置文件(文件名称固定,位置固定)(直接上代码)
(1) 配置db信息
(2) 配置hibernate信息(可选)
(3) 引入映射配置文件
Hibernate 核心API:
(1)Configuration : 加载核心配置文件
(2)SessionFactory : 由Configuration对象创建
在创建过程中:
根据核心配置文件,读取db信息,读取映射配置文件,根据映射关系自动创建/更新表(前提在核心配置文件中开启相关配置)
> 这些步骤特别消耗资源
> 写成单例模式
> 新建工具类, 静态代码块
(3)Session : 由SessionFactory创建,是持久化操作核心API
Hibernate Session相当于JDBC Connection相对与JDBC。
crud操作的实现对应于session中的方法
Session特点:
3.1 非线程安全
3.2 Session实例是轻量级的,创建和删除不需要消耗太多资源
3.3 Session对象内部有一个缓存,被称为Hibernate一级缓存,
一级缓存作用:
减少数据库访问频率,提高访问性能
保证缓存中对象与数据库同步,位于缓存中的对象成为持久化对象
当持久化对象
一级缓存特点:
当应用程序调用 Session 接口的 save()、update()、saveOrUpdate() 时,如果 Session 缓存中没有相应的对象,则 Hibernate 就会自动把从数据库中查询到的相应对象信息加入到一级缓存中。
当调用 Session 接口的 load()、get() 方法,以及 Query 接口的 list()、iterator() 方法时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询的对象,则再去数据库中查询对应对象,并添加到一级缓存中。
当调用 Session 的 close() 方法时,Session 缓存会被清空。
Session 能够在某些情况下,按照缓存中对象的变化,执行相关的 SQL 语句同步更新数据库,这一过程被称为刷出缓存(flush)。
↓
二级缓存 ,是SessionFactory级别的, 基于应用程序级别的缓存, 可以跨多个session,即不同的session都可以访问缓存数据
二级缓存也可分为 1)内置缓存
Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映射元数据和预定义的SQL语句放置到SessionFactory的缓存中。该内置缓存是只读的。
2)外置缓存
通常说的二级缓存就是外置缓存. 在默认情况下SessionFactory不会启用这个缓存插件,外置缓存中的数据是数据库数据的复制,外置缓存的物理介质可以是内存或者硬盘。
(4)Transaction :通过Session对象开启.
Hibernate Transaction是对JDBC Transaction或JTA Transaction的封装.
Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫无神秘可言,只不过在Hibernate中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true. 所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应。
持久化对象状态:
1)瞬时态(transient)
瞬时态也称为临时态或者自由态,瞬时态的对象是由 new 关键字开辟内存空间的对象,不存在持久化标识 OID(相当于主键值),且未与任何的 Session 实例相关联,在数据库中也没有记录,失去引用后将被 JVM 回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系。 > 自闭
2)持久态(persistent)
持久态的对象存在一个持久化标识 OID,当对象加入到 Session 缓存中时,就与 Session 实例相关联。它在数据库中存在与之对应的记录,每条记录只对应唯一的持久化对象。需要注意的是,持久态对象是在事务还未提交前变成持久态的。
3)游离态(detached)
脱管态也称离线态或者游离态,当持久化对象与 Session 断开时就变成了脱管态,但是脱管态依然存在持久化标识 OID,只是失去了与当前 Session 的关联。需要注意的是,游离态对象发生改变时 Hibernate 是不能检测到的。

当一个对象通过 new 关键字创建后,该对象处于瞬时态;当对瞬时态对象执行 Session 的 save() 或 saveOrUpdate() 方法后,该对象将被放入 Session 的一级缓存中,此时该对象处于持久态。
当对持久态对象执行 evict()、close() 或 clear() 操作后,对象会进入脱管态。
当直接执行 Session 的 get()、load()、find() 或 iterate() 等方法从数据库中查询出对象时,查询到的对象也会处于持久态。
当对数据库中的纪录进行 update()、saveOrUpdate() 以及 lock() 等操作后,此时脱管态的对象就过渡到持久态;由于瞬时态和脱管态的对象不在 session 的管理范围内,所以会在一段时间后被 JVM 回收。
收获
问题
明天的计划: 继续准备Hibernate小课堂. 看看设计模式.
评论