1.什么是Hibernate?
????????? 首先,Hibernate是数据持久层的一个轻量级框架。数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等等。
????????? 而且Hibernate是一个开源的orm(object relations mapping)框架。提供了查询获取数据的方法。用面向对象的思想来操作数据库。节省了我们开发处理数据的时间。
2.那使用Hibernate的长处呢?
????????? 1.使用简单介绍的hql语句(Hibernate query language)。能够不使用传统的insert,update等sql语句。比方insert一个对象。原来的做法是:insert into 表名称 alue(值1,值2,值3,……)。而如今的做法是:save(对象)。
????????? 2.使用or映射。对象到关系数据库之间的映射。
是从对象的角度操作数据库,再次体现了面向对象思想。原来的实体抽取方法:首先有了表,然后表映射实体对象。而如今Hibernate做法是:直接由对象映射到表。
????????? 3.没有侵入性,移植性比較好。什么是没有侵入性?就是Hibernate採用了pojo对象。所谓的pojo对象就是没有继承Hibernate类或实现Hibernate接口。
这种话,此类就是一个普通的java类,所以移植性比較好。
??
???????? 4.支持透明持久化。透明是针对上层而言的。三层架构的理念是上层对下层的依赖,仅仅是依赖接口不依赖具体实现。而Hibernate中的透明是指对业务逻辑层提供了一个接口session,而其它的都封装隐藏。持久化是指把内存中的数据存放到磁盘上的文件里。
3.当然一个事物,不可能十全十美。即使如此优秀的Hibernate也有自己的弱点。比方:若是大量数据批量操作。则不适合使用Hibernate。
而且一个持久化对象不能映射到多张表中。
4.Hibernate中核心5个接口
???????1.Configuration接口:负责配置及启动Hibernate,用来创建sessionFactory
???????2.SessionFactory接口:一个SessionFactory相应一个数据源存储。也就是一个数据库相应一个SessionFactory。
SessionFactory用来创建Session对象。而且SessionFactory是线程安全的,能够由多个线程訪问SessionFactory共享。
???????3.Session接口:这个接口是Hibernate中经常使用的接口,主要用于对数据的操作(增删改查)。而这个Session对象不是线程安全的。不能共享。
???????4.Query接口:用于数据库的查询对象。
???????5.Transaction接口:Hibernate事务接口。它封装了底层的事务操作,比方JTA(;java transcation architecture)全部的数据操作。比方增删改查都写在事务中。
那我们看一下hibernate中总体的内容:
???我们一一介绍当中的内容。
- Hibernate出现的原因上篇博客已经介绍。能够參考《Hibernate介绍》
- Hibernate中的核心五大接口,在上篇博客中也已经介绍,能够參考《Hibernate介绍》
- 怎样搭建Hibernate,请參考《八步具体解释Hibernate的搭建及使用》
- 持久化对象的三种状态。
分别为:瞬时状态(Transient)。持久化状态(Persistent)。离线状态(Detached)。三种状态下的对象的生命周期例如以下:
三种状态的差别是:瞬时状态的对象:没有被session管理。在数据库没有;持久化状态的对象:被session管理,在数据库存在,当属性发生改变,在清理缓存时。会自己主动和数据库同步。离线状态:没有被session管理,可是在数据库中存在。
5.測试工具Juit。
測试类须要继承TestCase。编写单元測试方法。方法名称必须为test开头。方法没有參数没有返回值,採用public修饰。当中在測试中,查询对象时,使用get或者load两种方法进行载入,这个方案的差别:get不支持延迟载入。而load默认情况下是支持延迟载入。而且get查询对象不存在时。返回null;而load查询对象不存在时,则抛出ObjectNotFoundException异常。
6.悲观锁和乐观锁解释。
悲观锁为了解决并发性。跟操作系统中的进程中加入锁的概念一样。就是在整个过程中在事务提交之前或回滚之前,其它的进程是无法訪问这个资源的。悲观锁的实现方式有两种:一种使用数据库中的独占锁。还有一种是在数据库加入一个锁的字段。hibernate中声明锁例如以下:
Account account = (Account)session.get(Account.class, 1, LockMode.UPGRADE);而net.sf.hibernate.LockMode类表示锁模式。当取值LockMode.UPGRADE时,则表示使用悲观锁for update。而乐观锁是为了解决版本号冲突的问题。就是在数据库中加入version字段。每次更新时,则把自己的version与数据库中的version进行比較,若是版本号相比較低。则不同意进行改动更新。
7.H ibernate中的缓存机制。
缓存是什么呢?缓存是应用程序和数据库之间的内存的一片区域。
基本的目的是:为了降低对数据库读取的时间。
当查询数据时,首先在缓存中查询,若存在。则直接取出,若不存在,然后再向数据库中查询。
所以应该把经常訪问数据库的数据放到缓存中。至于缓存中的数据怎样不断的置换。这也须要涉及一种淘汰数据的算法。
谈到这个hibernate中的缓存,你想到了什么呢?刚才叙述缓存时。是否感觉非常熟悉。感觉从哪也听过似的。嗯呢,是呢。是非常熟悉,写着写着就非常熟悉。这个刚才的缓存以及缓存的置换算法就和计算机组成中的cache相似。
好吧,来回到我们hibernate中的缓存。
hibernate中的缓存能够分为两种:一级缓存,也称session缓存;二级缓存。是由sessionFactory管理。
那一级缓存和二级缓存有什么差别呢?差别的关键关于:缓存的生命周期,也就是缓存的范围不同。
那首先介绍一下缓存的生命周期,也就是缓存的范围。
1.事务缓存,每一个事务都有自己的缓存,当事务结束。则缓存的生命周期相同结束,正如上篇博客中我们提到,对数据库的操作,增删改查都是放到事务中的。和事务保持同步,若是事务提交完成,通常是不同意是再次对数据库进行操作。
所以session是属于事务缓存的。
2.应用缓存,一个应用程序中的缓存,也就是应用程序中的全部事务的缓存。
仅仅有当应用程序结束时。此时的缓存的额生命周期结束。二级缓存就是应用缓存。
3.集群缓存。被一台机器或多台机器的进程共享。
这下明确了一级缓存和二级缓存的差别了吧。
那一级缓存和二级缓存的共同点是:都是缓存实体属性。
二级缓存普通情况都是由第三方插件实现的。第三方插件如:
EHCache,JbossCache(是由Jboss开源组织提供的)。osCache(open symphony),swarmCache。
前三种对hibernate中的查询缓存是支持的,后一种是不支持hibernate查询缓存。
那什么是hibernate查询缓存呢?
查询缓存是用来缓存普通属性的,对于实体对象而言,是缓存实体对象的id。
在了解Hibernate之前,我们先回想一下传统JDBC訪问数据库的相关内容。重点在于分析JDBC訪问存在哪些缺陷,这些缺陷在Hibernate中是怎样思考和解决的?
JDBC主要对象
?? ? ?DriveManager:代表驱动程序管理器,负责创建数据库连接?? ? ?Connection:代表数据库连接
?? ? ?Statement:负责运行SQL语句
?? ? ?PrepareStatement:继承Statement,负责运行SQL语句,具有提前定义SQL语句的功能
?? ? ?Result:代表SQL查询语句的查询结果集
JDBC訪问步骤
?? ? ?1、载入并注冊驱动JDBC驱动程序?? ? ?2、建立数据库连接
?? ? ?3、创建Statement对象。并准备运行SQL语句
?? ? ?4、运行SQL语句
?? ? ?5、依次关闭Statement和Connection对象
JDBC缺陷
?? ? ?1、编程人员既要懂Java语言。又要懂SQL语言。才干编写数据库訪问代码?? ? ?2、程序代码中嵌入大量字符串形式点的SQL语句,降低了程序代码的独立性和可读性
?? ? ?3、程序代码与关系数据库结构绑定在一起,削弱了程序代码的独立性和可靠性。例:数据库表改动了一个字段名。那么程序代码中涉及的SQL语句也要进行改动
?? ? ?4、编程人员须要了解,对象和表、属性和字段相应关系。因此编程人员即须要熟悉对象模型,又须要懂得关系数据库,还要了解两者的相应关系,所以编程人员不能依照全然面向对象的思维来编敲代码代码
??? ? ?了解JDBC訪问数据库的缺陷之后。我们接下来会做一个简单的演示样例,并针对此演示样例分析一下,Hibernate的运行步骤和怎样解决JDBC带来的缺陷。
?