sql语句的进化--hibernate篇
1.Hibernate对JDBC进行了封装:
1)Hibernate属于持久层的框架(典型三层架构:表示层、业务层、持久层),其他的持久层比如myBatis等
2)hibernate是开源的一个ORM(对象关系映射)框架
ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)。
没有hibernate之前,我们需要自己动手通过JDBC和SQL语句手动来操作数据库,而现在有了hibernate,我们可以直接对实体对象进行操作。
2.hibernate的核心接口
可以看出hibernate六大核心接口,两个主要配置文件:
1)Configuration接口:负责配置并启动Hibernate
Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。
Configuration对象用于配置并根启动Hibernate。Hibernate应用通过Configuration实例来指定对象—关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。
2)SessionFactory接口:负责初始化Hibernate
SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模 式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多 个数据库时,可以为每个数据库指定一个SessionFactory。
3)Session接口:负责持久化对象的CRUD操作
Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目 中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session 的开销太大,会给系统带来不良影响。但是Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象。 session可以看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个 持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。我们有时也称Session是一个持久层管理器,因为它包含这一些 持久层相关的操作, 诸如存储持久对象至数据库,以及从数据库中获得它们。
4)Transaction接口:负责事务
Transaction接口负责事务相关的操作,一般在Hibernate的增删改中出现,但是使用Hibernate的人一般使用Spring去管理事务。
5)Query接口和Criteria接口:负责执行各种数据库查询
Query负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。它的返回值一般是List。需要自己转换。
3.Hibernate运行过程
1)通过Configuration().configure(); 读取并解析hibernate.cfg.xml配置文件
2)由hibernate.cfg.xml中的<mapping resource="com/xx/Use.hbm.xml"/> 读取并解析映射信息
3)通过config.buildSessionFactory(); 创建事务SessionFactory
4)sessionFactory.openSession(); 打开Session
5)session.beginTransaction(); 创建事务Transaction
6)persistent operate 持久化操作
7)session.getTransaction().commit() 提交事务
8)关闭session
9)关闭sessionFactory
4.hibernate缓存原理与策略:
对于ORM来说,缓存尤为重要,它是持久层性能提升的关键。
缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问层中间.ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用,从而避免了数据库调用性能的开销.而相对内存操作而言,数据库调用是 一个代价高昂的过程。
一般来讲ORM中的缓存分为以下几类:
事务级缓存:即在当前事务范围内的数据缓存.
就Hibernate来讲,事务级缓存是基于Session的生命周期实现的,每个Session内部会存在一个数据缓存,它随着
Session的创建而存在,随着Session的销毁而灭亡,因此也称为Session Level Cache.
应用级缓存:
即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享(数据库事务或应用事务),事务之间的缓存共享策略与应用的事务隔离
机制密切相关.在Hibernate中,应用级缓存由SessionFactory实现,所有由一个SessionFactory创建的
Session实例共享此缓存,因此也称为SessionFactory Level Cache.
分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略.分布式缓存由多个应用级缓存实例组成,通过某种远程机制(RMI,JMS)实现各个缓存实例间的数据同步,任何一个实例的数据修改,将导致整个集群间的数据状态同步.
缓存以map的形式进行存储的(key-id,value-object)
Hibernate的一级缓存(Session):属于事务范围的缓存,由hibernate管理,一般情况下无需进行干预。
- 当应用程序调用Session的save、update、saveOrUpdate、get、load等接口以及调用查询接口的list()、iterate()、filter()等方法的时候,如果在Session缓存中还不存在相应的对象,Hibernate会把该对象加入到第一级缓存中。
- 当查询相应的字段如(name),而不是对象时,不支持缓存。
Session为应用程序提供了几个管理缓存的方法:
- evict(Object obj):从缓存中清除参数指定的持久化对象
- clear():清空缓存中所有持久化对象
- flush():使缓存与数据库同步。
Hibernate的二级缓存(Session):属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载,属于多事务级别,要防止事务并发性。
删除、更新、增加数据的时候,同时更新缓存。
Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此Hibernate提供了针对条件查询的Query Cache(此乃后话)。
适合存放到二级缓存中的数据:
- 很少被修改的数据
- 不是很重要的数据,允许偶尔并发的数据
- 不会被访问的数据
- 参考数据
不适合存放到第二级缓存的数据:
- 经常被修改的数据
- 财务数据,绝对不允许出现并发
- 与其它应用共享的数据
配置二级缓存的主要步骤:
1.选择需要使用二级缓存的持久化类,设置他的命名缓存的并发访问策略。这是最值得认真考虑的步骤。
2.选择合适的缓存插件,然后编辑该插件的配置文件。