hibernate

Hibernate简介
什么是hibernate
.hibernate是数据访问层的框架,对JDBC进行了封装,是针对数据库访问提出的面对对象的解
决方案

Hibernate的作用
使用Hibernate可以直接访问对象,Hibernate自动将此访问转换成SQL执行,从而达到了简洁
访问数据库的目的,简化了数据访问层的代码开发

Hibernate和jdbc的对比.

Hibernate和mybatis的对比

Hibernate框架的设计原理:
设计原理:
.Hibernate采用了ORM思想对JDBC进行了封装
.Hibernate框架是ORM思想的一种实现,解决了对象和数据库数据映射的问题
.Hibernate提供了一系列的API,允许我们直接访问实体的对象,然后其根据ORM映射关系,
转成SQL并且去执行,从而达到访问数据库的目的

ORM:(Object Relation Mapping),即对象关系映射,指的是java对象与关系数据库之间的
映射

.ORM思想:就是讲对象与数据库进行相互转换的思想,不同的框架/技术实现ORM手段不同,但
更多的是采用配置+反射的方式来实现ORM

Hibernate框架体系结构
主配置文件
Hibernate的主配置文件是一个XML,通常命名为hibernate.cfg.xml,该文件可以配置数据库
连接参数,Hibernate框架参数,以及映射关系文件

映射关系文件
.映射关系文件指定了实体类和数据表的对应关系,以及类中属性和表中字段之间的对应关系
.Hibernate中使用XML文件来描述映射关系,文件名通常为"实体类.hbm.xml",并放于实体类相同
的路径下

练习:Hibernate的基本使用
使用Hibernate完成对员工表的增删改查
方案:
Hibernate的使用步骤
1.导入Hibernate包,以及数据库驱动包
2.引入Hibernate主配置文件hibernate.cfg.xml
3.创建实体类
4.创建映射关系文件
5.使用Hibernate常用API执行增删改查操作

.开发步骤:
准备工作:
步骤一:创建员工表emp_h.
步骤二:导包
步骤三:引入Hibernate主配置文件,放在src根路径下,并在主配置文件中配置好数据库连接
信息,以及Hibernate框架参数
步骤四:创建实体类,用于封装员工表的信息
步骤五:创建映射关系文件
步骤六:声明映射关系文件
步骤七:创建Session工具类

hibernate组件生成策略
.4.1常用方式
sequence
.sequence是采用序列方式生成主键,适用于Oracle数据库
<generator class="sequence">
<!-- 指定用于生成主键的sequence -->
<param name="sequence">EMP_H_SEQ</param>
</generator>

identity
.identity是采用数据库自增长机制生成主键,适用于oracle之外的其他数据库

native
.native是根据当前配置的数据库方言,自动选择sequence或者identity
<generator class="sequence">
<!-- 指定用于生成主键的sequence -->
<param name="sequence">EMP_H_SEQ</param>
</generator>

increment
.increment不是采用数据自身机制来生成主键,而是使用hibernate提供的一种生成主键的
方式.
他会获取当前表中主键的最大值,然后加1作为新的主键
<generator class="increment">

</generator>
ps:这种方式在并发了高时存在问题,可能会生成重复的主键,因此不推荐使用

.assigned
assigned是Hibernate不负责生成主键,需要程序员自己处理主键的生成

uuid/hilo
uuid/hilo是采用uuid/hilo算法生成一个主键值,这个主键值是一个不规则的长数字
<generator class="uuid/hilo"/>
.注意:这种方式可以保证主键值不重复,但是没有规律,因此不能按主键排序

hibernate的映射类型
使用hibernate的预定义类型配置属性和字段的映射关系,重构Emp_h.hbm.xml,
将各个属性的type由java类型改为hibernate预定义类型,同时追加marry属性,
并使用布尔类型配置该属性

一级缓存
什么是一级缓存?
.hibernate创建每个Session对象时,都会给该Session分配一块独立的缓存区,用于存放该
Session查询出来的对象,这个分配给Session的缓存区称之为一级缓存,也叫session级缓存

为什么使用一级缓存
.Session取数据时,会优先向缓存区取数据,如果存在数据则直接返回,不存在才会去数据库
查询,从而降低了数据访问次数,提升了代码运行效率

如何使用一级缓存
.一级缓存是默认开启,在使用hibernate的API进行查询时会自动使用.

一级缓存特定:
一级缓存是Session独享的,每个Session不能访问其他Session的缓存区
.Session的save,update,delete操作会触发缓存更新.

一级缓存的管理
.Session.evict(obj)
将obj对象从一级缓存中移除

.Session.clear();
清除一级缓存中所有的obj

.Session.close();
关闭session,释放缓存空间

1.验证一级缓存
1.1设计几个测试方案,以验证一级缓存的存在及特性
用同一个session查询一个数据两次,如果只查询一次数据库,则验证了一级缓存的存在
1.2用2个不同的session,分别查询同一条数据,如果查询2次数据库说明一级缓存是session
独享的


对象持久性
Hibernate对象的三种状态
.在hibernate中,可以把实体对象看成三种状态,分别是临时态,持久态,流离态

临时态
.通过new创建的对象都是临时态,不在session管理中,数据库无对应记录
.通过delete方法操作的对象都为临时态

.特征
临时态可以被垃圾回收
临时态的对象未进行持久化,未与session关联

.持久态
通过get,load,list,Iterate等方法查询到的对象为持久态,处于session的管理中,
并且数据库中有对应记录
.通过save,update方法操作的对象转变为持久态

.特征
-持久态对象垃圾回收器不能回收
-持久态的对象进行了持久化与session相关联,实际上持久态对象存在session缓存中,
由session负责管理.
-持久态对象的数据可以自动更新到数据库中,时机是在调用session.flush()时执行,
还有就是commit也会触发同步
可以理解为:commit = session.flush+commit.

游离态的特征:
-通过session的evict,clear,close方法操作的对象转变为游离态
-游离态的特征:
-游离态的对象可以被垃圾回收,不在session管理之中,数据库存在对应记录中
-游离态的对象进行过持久化,但已经与session解除了关联

-验证持久态对象的特性
1.验证持久态对象存在于一级缓存中
2.持久态对象可以自动更新至数据库
3.持久态对象更新数据库的实际是session.flush();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值