1.Hibernate基本概念(了解)
1)Hibernate框架作用
hibernate是一个数据访问框架(持久层框架)
在项目中利用Hibernate框架可以实现对数据库的增删改查操作,为业务层构建一个持久层
原有使用JDBC+SQL方式对数据库操作,这种操作有些弊端
a.表字段多的情况下,SQL繁琐
b.不同数据库SQL语句存在一定差异,移植性较差
c.由于数据表记录与Java对象之间存在差异,将Java对象和数据表记录转换时,非常繁琐
利用Hibernate框架可以解决上述问题
2)Hibernate框架原理--(ORM)
ORM--Object Relation Mapping,对象关系映射
主要思想:将Java对象与关系表进行自动映射,这样可以将对象直接更新到数据库;
查询时,可以自动将数据表记录封装成Java对象
Hibernate框架基于ORM原理实现。Hibernate是目前主流的ORM工具,此外还有iBATIS,JPA
利用Hibernate框架可以简化数据库操作,它将JDBC和SQL语句封装起来,不需要使用者编写
开发者需要了解和使用Hibernate API;
session.save(user);
update(user)
delete(user)
User user = load(10);
Hibernate主要的体系结构如下:
a、实体类(User.java)n个
与数据表对应,用于封装数据表的一行记录
b、XML映射文件(User.hbm.xml)n个
用于描述实体类与数据表之间的对应关系。
类属性与表字段之间的对应关系
c、主配置文件(Hibernate.cfg.xml)
用于指定连接数据库的参数,框架参数等。
1)使用步骤:
a、引入Hibernate框架开发包
b、添加Hibernate主配置文件
c、根据数据表,编写实体类,映射文件
d、利用Hibernate API操作实体对象
Configuration:用于加载主配置文件和映射文件
SessionFactory:用于创建Session对象
Session:原Connection对象的封装,代表Hibernate与数据库之间的一次连接,负责执行增删改查操作
Transaction:用于进行事务管理,由于自动提交功能被Hibernate关闭,因此使用时,必须显式commit操作
Query:负责执行各种查询
-------------------------------------------------------------------------------------------------------------
Hibernate第二课
-------------------------------------------------------------------------------------------------------------
1.Hibernate映射问题
在hbm.xml中,定义属性和字段之间映射时,使用的tyoe属性,其作用是指定属性和字段之间采用哪种类型赋值.
常用的映射类型如下:
a。整数:integer,long,shirt,byte
b、浮点数:float,double
c、字符:character
d、布尔:yes_no,true_false;
完成布尔属性和字符字段之间映射 yes_no可以讲true映射成Y,false映射成N
true_false可以讲true映射成T,false映射成F
e、字符串:string
f、日期时间:date、time、timestamp
g、其他big_decimal,big_integer,clob,blob
2.Hibernate主键生成方式
在添加操作时,Hibernate可以负责生成主键值.在hbm.xml中利用<generator class="方式">元素指定。
常用的主键生成方式:
a、identity
主键值采用数据库自动增长机制生成,例如:MySQL,SQLServer,并在建表时设置自动增长、
b、sequence
主键值采用指定序列生成,Oracle特有的,仅Oracle采用
c、native
主键值根据数据库类型,自动选择identity,sequence等
d、increment
先执行select max(id)...语句获取当前主键最大值,再将主键值+1,写入数据表
e、其他uuid、hilo
主键值采用uuid或hilo高低位算法生成一个值
f、assigned
通知Hibernate不要负责主键值,这项工作交给程序员负责,需要程序员在代码指定一个主键值
如果需要按自定义规则生成主键值,可以自定义一个主键生成器。方法如下:
1)编写一个生成器类,实现IdentifierGenerator接口,实现约定的generator方法,该方法返回值就是主
键值。
2)在hbm.xml中通过<generator class="包名.类名">的方式使用
3.Hibernate对象状态
在使用Hibernate中,java对象有以下3钟状态
1)临时状态
使用时,刚new出来的对象
2)持久状态
使用了session对象的save,update,load等方法后,该对象就处于持久状态。
a、持久对象存在于Session缓存中,由Session负责管理
b、在利用Session查询时,hibernate会去session缓存中查找,如果没有再去数据库查找。
c、当Session缓存区中对象属性状态发生变化时,Session在事务提交后会负责更新到数据库。
3)托管或游离状态
当关闭session,或者使用session.evict()方法将对象移除后,该对象脱离了Session管理。
持久性概念:
持久对象才具有持久性。对象的数据状态,可以同步到数据中,垃圾回收器不能够回收该对象。
4.一级缓存
1)什么是一级缓存
一级缓存指的是Session级别的缓存。该Session管理的持久对象都在缓存中存储。
每个Session对象都有自己独立一级缓存空间。
2)一级缓存好处是:
当使用同一个Session对象重复查询相同数据对象时,第一次查询数据库,后续几次从缓存中获取。
3)一级缓存的管理
当使用session.load,session.get方法会将查询出对象自动放入一级缓存.
要移除一级缓存中的对象,可以使用
session.clear()//移除缓存中所有对象。
session.evict(obj)//移除指定的obj对象。
-------------------------------------------------
session.flush()//将缓存中对象的状态与数据库同步。
tx.commit()内部会首先调用flush,之后commit提交
4)为了更好的使用一级缓存,在同一线程处理中不同组件应使用同一个Session对象。可以使用ThreadLocal技术
将session对象与处理线程绑定。
从Hibernate3.0版本开始,将ThreadLocal机制进行了集成,在获取Session对象时,可以使用SessionFactory的
getCurrentSession()方法,该方法返回与当前处理线程相关的Session对象。
注意:currentSession对象必须在一个事务中使用,
在事务结束后会自动关闭session。
使用getCurrentSession()方法前需要在hibernate.cfg.xml中添加配置
<property name="current_session_context_class">
thread
</property >
5.延迟加载
1)什么是延迟加载
当使用session的load()或 iterator()方法查询时,返回的对象并没有立刻去数据库查询数据。
而是当使用对象的getter方法时,采用数据库获取数据。
2)什么时候启用延迟加载
a、使用session.load方法
b、使用query.iterator方法
c、使用关联映射,关联属性值采用延迟加载。
3)避免出现使用延迟加载异常
在使用延迟加载机制时,避免过早关闭session。在项目中,一般会将session关闭放在请求处理完毕后,
响应前。有以下方案:
a、利用过滤器执行session关闭