hibernate
一.优点:
1.Hibernate是一种ORM持久性框架,它是对jdbc做了轻量级的封装,使我们可以用面向对象的思维对数据库进行操作
2.支持各种关系数据库,有很好的级联功能很好的支持着表与表之间的关系.
3.与spring整合之后连接数据库的代码和控制事物的代码都统一,由spring管理,简化了代码,方便我们更好的管理事务;
4.hibernate提供一级和二级缓存的功能,极大的提高了性能.
5.hibernate提供了方便的API进行增删改查,减轻了大量sql语句的编写;
二.缺点:
1.hibernate在批量处理数据的时候比较弱势.
2.针对单一对象简单的增删改查,适合于hibernate,而对于批量的修改删除不适用与hibernate,这也是ORM框架的弱点
三.ORM映射
ORM 即(Object Relational Mapping)映射是指实体对象和数据库之间的映射关系.
四.hibernate的五大核心接口
1.configuration:配置hibernate,根据其启动hibernate,获取sessionFactory对象
2.sessionFactory:初始化hibernate,充当数据存储的的代理,创建session对象.sessionFactory线程是安全的.以为着他的同一个实例可以被应用的多个线程共享,是重量级二级缓存.
3.session:负则保存更新删除加载和查询对象,是一个非线程安全的避免多个线程共享一个session是轻量级的一级缓存.
4.Transaction :用来管理事务可以对事务进行提交和回滚;
5.Query:执行数据库的查询
五.Hql (Hibernate Query Language)
1.简介:Hql是面向对象的数据库查询语言,他和Sql查询语句优点相似,在Hibernate提供的各种检索方式中Hql使用最广泛的检索方式
2.Hql的功能
1).在查询语句中设定各种查询条件.
2).支持分页查询
3).支持连接查询
4).支持投影查询,即,仅检索出对象的部分属性.
5).支持分组查询支持使用Having和Group by等关键字.
6).提供内置级函数,sun(),min(),max();
7).支持子查询
8).支持动态绑定参数
9).能够调用用户定义的sql函数.
Hibernate的缓存机制
一.一级缓存
一级缓存:session级别的缓存,当我们使用了get/load/find/Query等,查询出的数据,默认在session中就会有一份缓存数据,缓存数据就是从数据库将一些数据拷贝一放到对应的地方.每次获取数据时,会先从缓存中查找, 如果再去数据库查询,提高了查询效率,减少了数据库的直接操作. 一级缓存不可卸载(只要使用session肯定就用到了session的缓存,是hibernate控制的 我们不能手动配置).
二.二级缓存
sessionFactory级别的缓存比session的作用范围广.可以做到多个session共享此数据,
1.sessionFactory缓存分类
1).内缓存:存储着预制的sql语句,对象和数据库的关系映射,
2).外缓存:存储的是我们允许使用二级缓存的对
2.二次缓存的使用场景
1).不经常改动的信息,多次查询的信息
2).对数据并发时的安全没有需求.
3).查询规则:先从一级缓存中查找,如果没有再从二级缓存中查找,如果还是没有再从数据库中查找.
3.二级缓存的配置流程
1.在cfg文件中打开二级缓存(默认是false)
1).指定使用二级缓存的factory
2).在mapping下配置使用二级缓存的类,也可以在hbm.xml文件的class中通过cache标签设置.
2.在cfg的同级目录下配置ceche.xml文件
1).disStore:配置的是缓存磁盘路径
2).default-cache默认配置
3).cache某个需要缓存的单独设置
Hibernate的单重三种状态
1.临时状态
1).该对象既没有在session中也没有在数据库中
2).刚实例化(new)出来的对象或者session执行delete之后的对象
2.持久化状态
1).该对象在session中存,数据库中也有该数据
2).临时状态的对象在执行了save方法后或游离状态下的对象执行了upDtate,get ,load方法之后都会进入持久化状态.
3.游离状态
1).对象在数据库中有标识符,在session中没有
2).session执行了close,clear evict等方法处于持久化状态的对象就处于游离状态
3).刚实例化出来的对象,如果在数据库中有他的主键,该对象是有游离状态.
Hibernate多表关联
Hibernate关联的映射关系
多对一 : many-to-one
一对多 :one-to-many
一对一 : one-to-one
多对多 : many-to-many
双方的配置
需要在一方的实体类中实例化多方的set或者list对象集合,在hbm.xml文件中做出相应的配置
其中,name的值是对应的实例化变量的变量名.class的值是对应方的实体类(包名+类名).
set/list的配置:(set是对应方集合)
name值是对应方集合成员变量的变量名,
inverse是设置这个属性(集合变量名)是否为关系的维护方,默认值是false如果inverse设置为true表示由对方维护两者之间的关系
cascade(级联)意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作all-代表在所有的情况下都执行级联操作none-在所有情况下都不执行级联操作save-update-在保存和更新的时候执行级联操作delete-在删除的时候执行级联操作
lazy:(懒加载)延迟加载,默认true,如学生实体不调用班级实体信息,可以不用加载
Hibernate事务的隔离级别
分为以下四点:
1. 原子性(atomic),事务必须是原子工作单元(单个逻辑工作单元);对于其数据修改,要么全都执行,要么全都不执行。
2. 一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。
3. 隔离性(insulation),由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
4. 持久性(Duration),事务完成之后,它对于系统的影响是永久性的。
1.其中常用的是事务的隔离性
1.)脏读(dirty read):如果第二个事务查询到第一个事务还未提交的更新数据,形成脏读。
2).虚读(phantom read):一个事务执行两次查询,第二次结果集包含第一次中没有或者某些行已被删除,造成两次结果不一致,只是另一个事务在这两次查询中间插入或者删除了数据造成的。
3).不可重复读(unrepeated read):一个事务两次读取同一行数据,结果得到不同状态结果,如中间正好另一个事务更新了该数据,两次结果相异,不可信任。
4).第一类丢失更新(lost update): 在完全未隔离事务的情况下,两个事物更新同一条数据资源,某一事物异常终止,回滚造成第一个完成的更新也同时丢失。
5).第二类丢失更新(second lost updates):是不可重复读的特殊情况,如果两个事务都读取同一行,然后两个都进行写操作,并提交,第一个事务所做的改变就会丢失。
事务隔离的四个级别
1. Serializable 串行化
2. Repeatable Read 可重复读
3. Read Commited 可读已提交
4. Read Uncommited 可读未提交
在hibernate.cfg.xml中使用hibernate.connection.isolation参数配置数据库事务隔离级别。其值添加在标签中间,一次为 1 , 2 , 4 , 8 ,事务的隔离级别和并发性能成反比.