`
jiagou
  • 浏览: 2537006 次
文章分类
社区版块
存档分类
最新评论

Hibernate介绍

 
阅读更多

由来

在出现hibernate框架之前,我们使用JDBC连接来读取数据库。每次都需要手动去书写sql语句来执行操作。为了提高程序的复用性,我们考虑过使用抽象工厂的模式将Dao层给分离出来。这样,确实是提高了程序复用性,但那是界面和业务逻辑层。Dao层的好多代码仍要进行改动。那有没有一种方式可以让我们的Dao层代码不进行改动呢?我们能不能不再每次都机械的进行增删改的sql语句的编写呢?Hibernate给我们解决了这个难题。有了它,只需要你创建一些列的持久化类,再加上一些配置文件,我们就可以轻松的完成对数据的读取了。

概念

百科上对其的解释为:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSPWeb应用中使用,最具革命意义的是,Hibernate可以在应用EJBJ2EE架构中取代CMP,完成数据持久化的重任。

通俗点说就是Hibernate几乎可以完成JDBC所能完成的任何操作(并不是所有)。

全局认识Hibernate

  • Hibernate的基本组件

HibernateORMobject relation mapping)的解决方案。他的基本组件主要包含实体,映射文件还有Hibernate配置文件。

  • Hibernate的核心接口

Session接口:负责执行被持久化对象的CRUDCreate Retrieve Update Delete)操作。需要注意的是Session对象是非线程安全的。

SessionFactory接口:负责初始化Hibernate。它充当数据存储原的代理,并负责创建Session对象。需要注意SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个 SessionFactory。

Configuration类:负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。

Transaction接口:负责事务相关的操作。

QueryCriteria接口:负责执行各种数据库查询

  • 持久化对象的概念及生命周期

使用Hibernate实际上是使我们采用对象化的思维操作关系型数据库。在数据库的操作过程中,对象分为以下三种状态。

瞬时对象(Transient Objects):他们的状态时瞬时的,他们并没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,他们的状态将会丢失,并由垃圾回收机制回收

持久化对象(Persist Objects:他们是具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的。它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行sqlinsertupdatedelete语句把内存中的状态同步到数据库中

离线状态(Detached Objects):Session关闭后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理

对象的生命周期如下图所示

  • 特点

优点:提高生产力。

使开发更加对象化

可移植性

没有侵入性,支持透明持久化

缺点:使用数据库特性语句,将很难调优

对大批量数据更新存在问题

系统中存在大量的统计查询功能

整体内容

结论

Hibernate在sql语句的编写上,不仅给我们封装了好多常用的语句,大大的简化了我们的编程操作。而且,也提供了hql语句,保留了自己手动编写sql语句的功能,使框架应用起来更加的灵活。由于Hibernate采用的是一种面向对象的思想去与数据库交流,这其中非常关键的一个环节就是映射文件。框架中介绍了多种映射,以满足不同的需要。要提高效率,频繁的与数据库打交道肯定不行,这里提供了缓存的知识。通过一级缓存,二级缓存的设置,来提高我们程序的运行效率。Hibernate简化了代码的编写,但是,配置文件的建立确实繁重了很多。此处,Hibernate提供了对jpa解析的支持。我们可以通过在代码上加一些注释,来简化配置文件的编写。如果对象一加载进来,就被实例化了,有些时候可能会影响效率,这里提供了lazy机制,可以在你需要的时候,再进行加载。说道效率,抓取的功劳不可忽视。有了抓取,原来需要发送n条sql语句能够执行的操作,这里很可能简化到一条就执行了。对于数据来说,线程安全问题一直是人们头疼的问题。事务当然也不可获取。Hibernate对事务进行了很好的封装。

Hibernate确实是在好多问题上给我们提供了很好的解决方案。但是,凡事都不绝对,它也存在这不太好的弊端。怎样发挥出他最大的长处,避免他的短处,就让我们在以后的实践中去体会吧。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics