• 欢迎来到本博客,希望可以y一起学习与分享

Hibernate(一)

Java benz 3年前 (2018-02-18) 136次浏览 0个评论 扫描二维码
文章目录[隐藏]

一、Hibernate概述

1.Hibernate

Hibernate框架是当今主流的Java持久层框架之一,由于它具有简单易学、灵活性强、扩展性强等特点,能够大大地简化程序的代码量,提高工作效率,因此受到广大开发人员的喜爱。
Hibernate是一个开放源代码的ORM(Object Relation Mapping,对象关系映射)框架,它对JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

Hibernate:就是一个持久层的ORM的框架
ORM:Object Relation Mapping,对象关系映射

所谓的ORM就是利用描述对象和数据库表之间映射的元数据,自动把Java应用程序中的对象,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据库表的操作。可以把ORM理解为关系型数据和对象的一个纽带,开发人员只需要关注纽带一端映射的对象即可。

简单的说就是把我们程序中的实体类和数据库表建立起来对应关系。

2.为什么学习Hibernate

使用传统的JDBC开发应用系统时,如果是小型应用系统,并不觉得有什么麻烦,但是对于大型应用系统的开发,使用JDBC就会显得力不从心。例如对几十、几百张包含几十个字段的表进行插入操作时,编写的SQL语句不但很长,而且繁琐,容易出错;在读取数据时,需要写多条getXxx语句从结果集中取出各个字段的信息,不但枯燥重复,并且工作量非常大。为了提高数据访问层的编程效率,Gavin King开发出了一个当今最流行的的ORM框架,它就是Hibernate框架。

ORM图

其优势具体如下:

  1. Hibernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存的消耗,加快了运行效率。
  2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度地简化了DAO(Data Access Object,数据访问对象)层的编码工作。
  3. Hibernate使用java的反射机制,而不是使用字节码增强程序类并实现透明性。
  4. Hibernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
  5. 可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自动编码进行扩展。

3.Hibernate 架构

Hibernate 架构是分层的,作为数据访问层,你不必知道底层 API 。Hibernate 利用数据库以及配置数据来为应用程序提供持续性服务(以及持续性对象)。

下面是一个非常高水平的 Hibernate 应用程序架构视图。

下面是一个详细的 Hibernate 应用程序体系结构视图以及一些重要的类。

Hibernate 使用不同的现存 Java API,比如 JDBC,Java 事务 API(JTA),以及 Java 命名和目录界面(JNDI)。JDBC 提供了一个基本的抽象级别的通用关系数据库的功能, Hibernate 支持几乎所有带有 JDBC 驱动的数据库。JNDI 和 JTA 允许 Hibernate 与 J2EE 应用程序服务器相集成。

下面的部分简要地描述了在 Hibernate 应用程序架构所涉及的每一个类对象。

配置对象

配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化期间创造。它代表了 Hibernate 所需一个配置或属性文件。配置对象提供了两种基础组件。

  • 数据库连接:由 Hibernate 支持的一个或多个配置文件处理。这些文件是 hibernate.properties 和 hibernate.cfg.xml
  • 类映射设置:这个组件创造了 Java 类和数据库表格之间的联系。

SessionFactory 对象

配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。

SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。

Session 对象

一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。持久对象通过 Session 对象保存和检索。

Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。

Transaction 对象

一个事务代表了与数据库工作的一个单元并且大部分 RDBMS 支持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。

这是一个选择性对象,Hibernate 应用程序可能不选择使用这个接口,而是在自己应用程序代码中管理事务。

Query 对象

Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。

Criteria 对象

Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。

二、Hibernate入门

1.下载Hibernate

下载地址:https://sourceforge.net/projects/hibernate/files/hibernate-orm/
或者:http://hibernate.org/orm/releases/
选择需要的版本下载

2.目录结构

以5.0.7.Final为例,下载解压后的目录结构如下:

从图可以看出,Hibernate5.0.7的解压目录中包含一系列的子目录,这些子目录分别用于存放在不同功能的文件,接下来针对这些子目录进行简单介绍,具体如下:

  1. documentaction文件夹:存放Hibernate的相关文档,包括参考文档的API文档。
  2. lib文件夹:存放Hibernate编译和运行所依赖的JAR包。其中required子目录下包含了运行Hibernate5项目必须的JAR包。
  3. project文件夹:存放Hibernate各种相关的源代码。

在lib/required子目录中,包含的JAR包

3.导包–Hibernate框架包 与 数据库驱动包

4.创建数据库与表

5. 创建实体(持久化类)

持久化类是应用程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。Hibernate使用普通Java对象(Plain Old Java Object),即POJO的编程模式来进行持久化。POJO类中包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问,对外部隐藏了内部的实现细节。下面就来编写Customer持久化类。
在项目src目录下,创建com.benz.domain包,并在包中创建实体类Customer(对应数据库表cst_customer),Customer类包含与cst_customer数据表字段对应的属性,以及相应的getXXX()和setXXX()方法。

注意:重写toString(),否则控制台输出不了查询到的信息

6. 创建映射文件

实体类Customer目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的那个表,以及类中的那个属性对应数据库表中的那个字段,这些都需要在映射文件中配置。
在实体类Customer所在的包中,创建一个名为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到cst_customer表的列上的。

7. 创建Hibernate的核心配置文件

Hibernate的映射文件反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配置数据库连接以及Hibernate运行时所需的各个属性值。在项目的src下创建一个名称为hibernate.cfg.xml(名称建议固定这样写)

该配置文件设置了数据库连接的相关属性以及其他的一些常用属性,并且通过mapping的resource属性将对象的映射信息加入到了Hibernate的配置文件中。

8. 编写测试代码

在项目中新建一个名称为com.benz.test的包,然后在包中建立一个名为Customertest.java的文件,该文件是用来测试的类文件。

首先创建Configuration类的实例,并通过它来读取并解析配置文件hibernate.cfg.xml。然后创建SessionFactory读取解析映射文件信息,并将Configuration对象中的所有配置信息拷贝到SessionFactory内存中。接下来,打开Session,让SessionFactory提供连接,并开启一个事务,之后创建对象,向对象中添加数据,通过session.save()方法完成向数据库中保存数据的操作。最后提交事务,并关闭资源。

最后文件的位置,如下图所示:

三、Hibernate相关API

Configuration:配置对象

Configuration主要用于Hibernate框架加载映射文件
Configuration类的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFaciory}对象。虽}eC。门ftgurat旧n类在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate时所遇到的第一个对象。
【加载核心配置文件】
在使用Hibernate 时,首先要创建Configuration实例,Configuration实例主要用于启动、加载、管理hibernate的配置文件信息。在启动Hibernate的过程中,Configuration实例首先确定Hibernate配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例。Configuration对象只存在于系统的初始化阶段,它将SessionFactory创建完成后,就完成了自己的使命。
Hibernate通常使用Configuration config=new Configuration().configure();的方式创建实例,此种方式默认会去src下读取hibernate. cfg.xml配置文件。如果不想使用默认的hibernate. cfg.xml配置文件,而是使用指定目录下(或自定义)的配置文件,则需要向configure()方法中传递一个文件路径的参数,其代码写法如下:

此种写法hibernate会去指定位置查找配置文件,例如,想要使用src下config包中的hibernate. cfg.xml文件,只需将文件位置加入configure()中即可,其代码如下所示:

【加载映射文件】
Hibernate除了可以使用Configuration对象加载核心配置文件以外,还可以利用该对象加载映射文件。因为如何使用properties文件作为Hibernate的核心配置文件,其他的属性可以使用key=value的格式来设置,但是映射没有办法加载。这时这个对象就有了用武之地。可以在手动编写代码的时候去加载映射文件。

SessionFactory : Session工厂对象

SessionFactory 接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要主意的是SessionFactory 并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory 。
SessionFactory 接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
SessionFactory 实例是通过Configuration对象获取的,其获取方法如下所示。

SessionFactory具有以下特点:

  1. 它是线程安全的,它的同一个实例能够供多个线程共享。
  2. 它是重量级的,不能随意的创建和销毁它的实例。

由于SessionFactory的这些特点,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此,在实际项目使用中,通常会抽取出一个HibernateUtils的工具类,用来提供Session对象。

Hibernate的工具类:

SessionFactory内部还维护了一个连接池,如果我们需要使用第三方的连接池如C3P0,那么需要我们自己手动进行配置
配置C3P0内容如下
引入C3P0相关JAR包
下载地址:http://sourceforge.net/projects/c3p0/files/

Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
创建SessionFactory实例后,就可以通过它获取Session实例。获取Session实例有两种方式,一种是通过openSession()方法,另一种是通过getCurrentSession()方法。两种方法获取session的代码如下所示:

以上两种获取session实例方式的主要区别是,采用openSession方法获取Session实例时,SessiorrFactory直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。而getCurrentSession方法创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。
Session是线程不安全的,多个并发线程同时操作一个Session实例时,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)。因此设计软件架构时,应避免多个线程共享一个Session实例。同时它也是轻量级的,实例的创建和销毁不需要消耗太多的资源。
它还有一个缓存,即Hibernate的一级缓存,这个缓存主要用于存放当前工作单元加载的对象。

在Session中提供了大量的常用方法,具体如下:

  1. save(), update()和saveOrLTpdate()方法:用于增加和修改对象。
  2. delete()方法:用于删除对象。
  3. get()和load()方法:根据主键查询。
  4. createQuery()和 createSQLQuery()方法:用于数据库操作对象。
  5. createCriteria()方法:条件查询。

Transaction

Transaction接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。Transaction接口是对实际事务实现的一个抽象,这些实现包JDBC的事务、JTA中的UserTransaction 、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Transaction接口主要用于管理事务,它是Hibernate的数据库事务接口,且对底层的事务接口进行了封装。Transaction接口的事务对象是通过Session对象开启的,其开启方式如下所示。

在Transaction接口中,提供了事务管理的常用方法,具体如下:

  1. commit()方法:提交相关联的session实例。
  2. rollback()方法:撤销事务操作。

Session执行完数据库操作后,要使用Transaction接口的commit()方法进行事务提交,才能真正的将数据操作同步到数据库中。发生异常时,需要使用rollback()方法进行事务回滚,以避免数据发生错误。因此,在持久化操作后,必须调用Transaction接口的commit()方法和rollback()方法。如果没有开启事务,那么每个Session的操作,都相当于一个独立的操作。


文章 Hibernate(一) 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!