Hibernate

前言

面向对象是Java编程的特点,但在数据库的编程中,操作对象为关系型数据库,并不能对实体对象直接持久化,Hibernate通过ORM技术(参见ORM文章)解决了这一问题,在实体对象与数据库间提供了一座桥梁。

先说说之前我们是怎么对一个对象进行 持久化  的:

1、先是通过反射拿到数据库驱动

2、然后创建connection对象

3、然后创建statement对象,由statement执行sql语句,往数据库里插入一条数据

这样这个对象就已经被实例化了。

在看看对一个持久化的数据怎么  映射  给一个对象的:

1、拿到conn,statement,执行查询语句

2、new一个对象,将查询到的数据一一调用对象的set方法

是不是感觉这样很麻烦?下面介绍一种全新的框架Hibernate。Hibernate是在核心理念ORM技术上实现的轻量级全自动的orm框架。

 ORM

ROM是对象到关系的映射,是一种解决实体对象与关系型数据库相互匹配的技术,其实现思想就是将数据库中的数据表映射为对象,对关系型数据以对象的形式进行操作。在软件开发中,对象和关系数据是业务实体的两种表现形式,ORM通过使用描述对象和数据库之间映射的元数据,将对象自动持久化到关系数据库中。实质上,ORM在业务逻辑层与数据库层之间充当桥梁的作用,它对对象(Object)到关系数据(Relational)进行映射(Mapping)。

Hibernate

Hibernate框架中,ORM的设计思想得以具体实现。Hibernate主要通过映射文件(*.hbm.xml)及Hibernate配置文件(*.cfg.xml)与数据库进行交互。其中持久化类是操作对象,用于描述数据表的结构;映射文件指定持久化类与数据表之间的映射关系,如数据库的连接信息等。

 

Hibernate简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操作数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE框架中取代CMP,完成数据持久化的重任。

Hibernate的结构体系

Hibernate

 

 

Hibernate在原由的三层结构(MVC)的基础上,从业务逻辑层中分离出持久化层,专门负责数据的持久化操作,使业务逻辑层可以真正的专注于业务逻辑的开发,不再需要编写负复杂的SQL语句。增加持久化层的软件分层。

 Hibernate

 

上图中,Hibernate封装了数据库的访问细节,并一直维护着实体类与关系型数据库中数据表之间的映射关系,业务处理可以通过Hibernate提供的API接口进行数据库操作。

Hibernate的常用接口主要有COnfiguration接口、SessionFactory接口、Session接口、Transaction接口、Query接口和Criteria接口。

 

Configuration接口

Configuration接口用于加载Hibernate的配置文件及启动Hibernate,创建SessionFactory实例。Hibernate的启动过程中,Configuration对象首先加载Hibernate的配置文件并对其进行读取,然后根据配置创建SessionFactory对象。

 

SessionFactory接口

SessionFactory接口用于Hibernate进行初始化操作。它是一个Session工厂,Session对象从此接口获取。通常一个项目只有一个SessionFactory对象,因为它对应一个数据库;如果项目中存在多个数据库,可以存在多个SessionFactory对象。但要注意SessionFactory是一个重量级对象,其创建比较耗时、占用资源,它是线程安全的。

 

Session接口

Session接口是操作数据库的核心对象,它负责管理所有持久化相关的操作,也称为CRUD操作使用此对象时应该注意,Session对象与SessionFactory对象不同,它是非线程安全的,应该避免多个线程共享同一个Session,其创建不会消耗太多的资源。

 

Transaction接口

Transaction接口用于对事务的相关操作,如事务的提交、回滚等操作。

 

Query接口

Query接口主要用于对数据库的查询操作,功能十分强大,其单检索、分页查询等诸多方法为程序开发提供了方便。其中,面向对象查询预言HQL通过此接口进行实现。

  

Criteria接口

Criteria接口同样用于对数据的查询操作,它为Hibernate的另一种查询方式QBC提供了方法。

 

 

Hibernate实例状态

Hibernate将实例的状态划分为三种,分别为Transient(瞬时)状态、Persistent(持久)状态、Detached(托管)状态。

 

Transient(瞬时)

如果一个实体对象通过new关键字进行创建,并没有纳入Hibernate Session的管理之中,就被认定是Transient(瞬时)状态。如果Transient(瞬时)对象在程序中没用被引用,则将被垃圾回收器回收,其特征在于数据库中没用与之匹配的数据,也没有在Hibernate缓存管理之内。

 

情况分析:

1、一个对象刚被创建出来,在内存中存在,但是并没有实例化到磁盘。

2、一个对象的实例化的内容从磁盘销毁后,该对象变为瞬时状态。

思考总结:

只要一个对象进行了数据库的增、查、改操作都会被标记为持久状态,该对象没进行过数据库操作或被数据库清除都属于瞬时状态。瞬时状态:该对象在库中不存在id

 

Persistent(持久)

处于Persistent(持久)状态的对象在数据库中有与之匹配的数据,在Hibernate缓存的管理之内。当持久对象有任何的改动时,Hibernate在更新缓存时将对其进行更新;如果Perisitent状态变成了Transient,Hibernate同样会自动对其进行删除操作,不需要手动检测数据。

 

情况分析:

只要进行了数据库的增、查、改操作后的对象都会被hibernate管理,这些对象的状态为Persistent。数据库中已经存在该对象的id。

 

Detached(托管)

Persistent(持久)对象在Session关闭后变为Detached(托管)状态,其特征在于数据库中存在与之匹配的数据,但并没有在Session的管理之内。

 

情况分析:

我一直在纳闷,如何从一个托管状态之间变为持久状态?在结构图中说只要调用了update()、saveOrUpdate()就会使得托管状态变为持久状态,但是如果你想直接去使用这两个方法,你就不得不先获取实体,也就是要先调用get/load/find/iterat等方法才行。包括从托管状态变为瞬时状态也是,你都要先获取实体。

 

案例

struts2+hibernate

 

前言

面向对象是Java编程的特点,但在数据库的编程中,操作对象为关系型数据库,并不能对实体对象直接持久化,Hibernate通过ORM技术(参见ORM文章)解决了这一问题,在实体对象与数据库间提供了一座桥梁。

先说说之前我们是怎么对一个对象进行 持久化  的:

1、先是通过反射拿到数据库驱动

2、然后创建connection对象

3、然后创建statement对象,由statement执行sql语句,往数据库里插入一条数据

这样这个对象就已经被实例化了。

在看看对一个持久化的数据怎么  映射  给一个对象的:

1、拿到conn,statement,执行查询语句

2、new一个对象,将查询到的数据一一调用对象的set方法

是不是感觉这样很麻烦?下面介绍一种全新的框架Hibernate。Hibernate是在核心理念ORM技术上实现的轻量级全自动的orm框架。

 

Hibernate

上一篇:wsl  php sock没有权限, 页面加载慢


下一篇:【C语言天天练(十八)】字符/字符串输入函数fgetc、fgets、getc、getchar和gets