hibernate框架基础
浅谈hibernate基础
1. hibernate原理?
hibernate是SSH这套框架中的持久层框架,在hibernate中封装的是JDBC的核心,
而JDBC的核心是获得在java代码中操控SQL语句的权利,并使用这种权利。从这
方面来看,hibernate的实质就是JDBC。
2. JDBC原理?
1.connection连接的获得方式;
2.两种执行者(sql注入)(sql预编译);
3.两种操作
1.更新操作 update
2.查找操作 query
4.批处理,开启事务,提交和回滚
3. 使用hibernate实现JDBC?
hibernate有一套自己的对象映射关系(ORM),就是PO(永久化对象)和表的映射
类和表分别一一对应
1.类 和 表的映射
2.属性 和 表字段的映射
3.类属性类型 和 表字段类型的映射
以上关系互相映射前,使用@Entity先实例化
4. hibernate 使用思路?
1.导jar包(9个);
2.配置
1.Annotation
Annotation 是直接在bean中通过实例化(Entity)和主键生成策略实现和数据库的关联
2.配置文件
1.properties
hibernate.properties (内容:jdbc+hibernate)
2.xml
1.bean.hbm.xml;
2.hibernate.cfg.xml; (内容:jdbc+hibernate)
5. hibernate 主键生成策略?
主键生成策略主要分为三大类,为:
1.代理主键
1.increment 自动增长
它是每次增加前先在数据库里查询最大的ID然后根据ID值+1,
因为需要频繁向数据库发送请求,在处理大量数据时容易出现
并发问题,所以不推荐使用;
2.identity 自动增长
它的自动增长是在数据库实现,但是它只对mysql数据库有效,作用范围
小,所以也不推荐使用;
3.sequence 序列
sequence是只能对oracle数据库能够实现自动增长,和identity一样,
所以也不推荐使用;
4.uuid.hex 编号
uuid方法在刚出来是很受追捧,但是因为其字段值太长
导致后期数据处理太麻烦而被舍弃
5.hilo high low 高低位主键
hilo策略在生成主键ID的同时,还会在数据库中生成一张
额外的表来保存hilo的值,这样相当于为程序后期维护增加难度,所以
也不推荐使用
6.native 本地化
现在一般在数据库中生成表时,除非有特殊要求或个人爱好,一般都是使用native,
它可以根据你所使用的数据库自动识别,匹配相应的自动增长策略
2.自然主键
assigned
它是由应用程序负责生成的主键,在数据进行添加(save)之前必须指定对象。
hibernate不负责维护主键生成,在存储对象之前,必须使用setter方法为
主键赋值。所以这种方法我们应尽量不要使用。
3.自定义主键
自定义主键是为了满足一些特殊的主键ID,可以通过Serializable,
Configurable,IdentifierGenerator进行主键生成方法重写,来改变生成
主键的内容
6. hibernate的缓存机制
1.什么是缓存?
缓存就是把上传或查找的数据放在一个特定的地方,一般是在磁盘,然后根据后续方法
决定这些数据的去向。
2.为什么要缓存?
因为我们的程序要经常访问数据库,为了降低程序对服务器的压力。缓存中的数据相当于
把之前的数据复制在磁盘中,程序从缓存中读取数据,从而达到降低服务器压力的效果。
3.hibernate缓存有一级和二级两种方式
1.一级缓存(session)
一级缓存也被称为session级缓存。
它的生命周期为:
当session被 open 时,缓存即被打开
当session被 close时,缓存即被关闭
同时,只要在它的生命周期内,多次加载同一个持久化对象,
只有第一次发送SQL语句,之后都是加载缓存中的信息。但是因为Session
从打开到关闭的时间一般都很短暂,业务方法调用而打开,调用结束而关闭,
在如此短暂的时间内,多次加载同一个的对象的可能性不太,所以一级缓存使用很少。
2.二级缓存(sessionFactory)
sessionFactory对象的生命周期是程序的整个会话过程,因此二级缓存可以进行范围级
的缓存,但也有可能出现并发的问题,所以应同时做好解决策略,如(同步锁)。
7. hibernate 对象
hibernate主要有以下三种对象
1.configuration
主要是用来加载解析配置文件的,其中包括jdbc+hibernate 基础配置
和 ORM配置
主要方法有:
1. configuration.configure()
2. configuration.addClass();
3. configuration.addAnnotatedClass(AnnotatedClass);
2.sessionFactory
sessionFactory主要担当连接工厂的作用,它的里面包括了:
1. 解析后 的 jdbc+hibernate 基础配置
2. 解析后 的 orm 配置
3. 拼装的 SQL
4. spring
主要方法有:
1. sessionFactory.openSession();
2. sessionFacotry.getCurrentSession();
3.session
session负责连接上数据库后开启事务进行增删改查的操作
它的方法很多,但主要讲讲以下几个:
1.saveOrUpdate
update/merge
如果两个对象相同-->不执行更新SQL语句
如果内容不同-->执行更新SQL语句
2.get()
get方法不支持延时加载,如果查询的结果为空,返回null
3.load()
load方法支持延时加载,如果查询的结果为空,报异常
延时加载的意思是,当对象被方法调用是,才会加载创建对象
4.close()
当执行完close()后,下次的session就是一个全新的session对象了
5.clear()
执行clear()后,只是清空了当前的session缓存,对象不会改变
6.evict()
只清除指定对象的缓存
8. hibernate 状态
hibernate共有三大状态,分别是
1.临时状态
2.持久化状态(PO)
3.游离状态(VO)
1.临时状态
临时状态是new 命令开辟的新对象,此时,它只是单独存在的,和数据库的数据没有关联关系
,但是只要通过session的save()或saveOrUpdate()方法让它与数据库向关联,并将数据插入
数据库中,它就会转变成持久化对象。
2.持久化状态
持久化状态的对象在数据库具有相对应的记录,如被session的get()、load()方法获得对象都是
持久对象。当持久化对象被修改时,并不是马上同步到数据库中,而是等到commit()执行以后
,但是如果使用delete()方法,持久化对象就会变成临时对象。
3.游离状态
当一个持久化对象被使用了close(),clear(),evict()方法之后,它就会变成游离状态,游离状态
时,它有OID,但是在session缓存中查不到值。游离状态可以通过update(),saveOrUpdate()方法
重新变成持久化状态。
9. hibernate 检索?
hibernate 检索大体分为四类:
1.OID;
2.HQL;
3.SQL;
4.QBC;
1.OID的检索方式
OID主要有使用session的get()和load()方法加载某条记录对应的对象,
其中,因为方法不同所以返回类型也不同。
get()方法默认为空,在执行查询操作时,会先在缓存中找数据,
缓存没有的话再去数据库找,如果数据库中也没有就会返回一个null值。
load()方法默认是有值的,但是当它在缓存和数据库中找不到所对应的对象
时,load()方法会报一个异常。
2.HQL的检索方式
HQL是面向对象的查询语言,它和SQL极其相似。是使用最广泛的一种查询方式。
它几乎具有SQL查询语句的所有功能,如:分页,排序,分组,调用聚合函数
(max,min,count,sum,num),还可以进行子查询等等。
3.SQL的检索方法
就是SQL语句。
4.QBC的检索方式
QBC的检索方式相似于StringBuffer的拼接字符串,由Criteria接口实现。它支持
在运行时动态生成查询语句。但是在实际项目中我们大多用HQL检索。
10. hibernate 关联关系?
hibernate的关联关系有
1.一对一;
2.一对多;
3.多对多;
从简单来讲
1.一对一是一张表对应另一张表,好比人和身份证的关系。
使用一对一时,要注意在配置文件中为标签(<one-to-one>) 设置unique属性
并赋值true,这样就限制了多重性的唯一(外键关联)
2.一对多是一张表对应多张表,好比老师和学生的关系。
使用一对多的关系映射时,在多的表里加入外键指向一的唯一。
它的维护关系是一指向多的关系
3.多对多是多张表之间互相映射,比如说一个人可以在不同的地方都有房子,而这些
地方又有许多别人的房子,用户和地址互相映射。
这种情况在数据库中的表现就是在用户表中映射地址表的主键,地址表中又有用户
表的主键,主键互相关联,就形成了多对多的情况。