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中总体的内容:

   我们一一介绍当中的内容。

  1. Hibernate出现的原因上篇博客已经介绍。能够參考《Hibernate介绍》
  2. Hibernate中的核心五大接口,在上篇博客中也已经介绍,能够參考《Hibernate介绍》
  3. 怎样搭建Hibernate,请參考《八步具体解释Hibernate的搭建及使用》
  4. 持久化对象的三种状态。

分别为:瞬时状态(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带来的缺陷。

 

最新文章

  1. IDEA使用maven中tomcat插件启动项目乱码问题
  2. WebView一般用法总结
  3. ASC47B borderless
  4. js中我的注释规范
  5. js中this对象,call,apply
  6. 【代码分享】简单html5足球射门游戏分享
  7. 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题
  8. js获取url中的参数对象、js生成带参数的url
  9. python 连接数据库-设置oracle ,mysql 中文字符问题
  10. Java学习之IO字节流
  11. hackerrank Diameter Minimization
  12. C# get 、set、索引器
  13. java 两个List集合各种情况对比处理
  14. Git:fatal: Authentication failed
  15. 注入攻击(SQL注入防御)
  16. 高并发分布式系统中生成全局唯一(订单号)Id
  17. Linux-pkill命令
  18. Kafka: Connect
  19. Python3基础 help 查看内置函数说明
  20. 跟着Nisy一起学习C语言

热门文章

  1. poj 1664放苹果(转载,不详细,勿点)(递归)
  2. 10MongoDB
  3. (11) openssl req(生成请求证书、私钥和自建CA)
  4. 笔记本无法从DHCP服务器获取地址怎么解决?
  5. python 简易计算器(只能计算加减乘除和括号)
  6. 2. TypeScript笔记
  7. CDOJ 1217 The Battle of Chibi
  8. POJ-3100-Root of the Problem,原来是水题,暴力求解~~~
  9. HDU 4597
  10. Poj3253:Fence Repair 【贪心 堆】