JAVA Web学习(22)___第16章Hibernate技术

第16章Hibernate技术

16.1 初识 Hibernate

16.1.1 理解ORM原理

16.1.2 Hibernate简介

Hibernate 是一款免费开源的持久层框架,它对 JDBC 进行了轻量级的对象封装,将对象与数据库表建立了映射关系,使 Java 编程人员可以随心所欲地使用面向对象的编程思想操作数据库。

Hibernate 具有简单易用、灵活性强、扩展性强等特点,大大提高了程序的开发效率。

使用传统的 JDBC 开发小型应用系统,并不会有什么麻烦,但是对于大型应用系统的开发,使用 JDBC 就会显得力不从心。

例如对几十、几百张包含几十个字段的表进行插入操作时,编写的 SQL 语句不但很长,而且繁琐,容易出错;在读取数据时,需要编写多条语句从结果集中取出各个字段的信息,工作量非常大。

为了提高数据访问层的编程效率,Gavin King 开发了一个当今最流行的 ORM(即 Object-Relational Mapping 对象关系映射)框架—— Hibernate 框架。

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

与其他操作数据库的技术相比,Hibernate 具有以下几点优势。

  • Hibernate 对 JDBC 访问数据库的代码进行了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
  • Hibernate 使用 Java 的反射机制,而不是使用字节码增强程序类,并实现了透明性。
  • Hibernate 的功能强大,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
  • 可扩展性强,由于源代码的开源以及 API 的开放,当本身功能不够用时,可以自行编码进行扩展。
  • 配置类 Configuration
    配置类主要负责管理Hibernate的配置信息以及启动 Hibernate,在 Hibernate运行时配置类会读取一些底层实现的基本信息,其中包括数据库URL、数据库用户名、数据库密码、数据库驱动类和数据库适配器(dialect)。
  • 会话工厂类 SessionFactory
    会话工厂类是生成Session的工厂,它保证了当前数据库中所有的映射关系,可能只有一个可选的二级数据缓存,并且它是线程安全的。但是会话工厂类是一个重量级对象,它的初始化创建过程会耗费大量的系统资源。
  • 会话类 Session
    会话类是 Hibernate中数据库持久化操作的核心,它将负责 Hibernate所有持久化操作,通过它开发人员可以实现数据库基本的增删改查的操作。但会话类并不是线程安全的,应注意不要多个线程共享一个Session。

16.2 Hibernate入门

16.2.1 获取Hibernate

表 2 Hibernate 3所需的JAR包的说明

JAR包名称 描 述
hibernate3.jar Hibernate 的核心包
antlr-2.7.6.jar 语言转换工具,Hibernate 利用它实现 HQL 到 SQL 的转换
commons-collections-3.1.jar collections Apache 的工具集,用于增强 Java 对集合的处理能力
dom4j-l.6.1.jar dom4j XML解析器
javassist-3.12.0.GA.jar 代码生成工具,Hibernate 利用它在运行时扩展 Java 类
jta-1.1.jar 标准的 JAVA 事务(跨数据库)处理接口
slf4j-api-l.6.1.jar 只是一个接口,用于整合 log4j
hibernate-jpa-2.0-api-1.0.1.Final.jar JPA 接口开发包
log4j-l.2.17.jar Log4j 日志文件核心 JAR
slf4j-log4jl2-l.7.12.jar Hibernate 使用的一个日志系统

需要注意的是,Hibernate 框架要想与数据库建立连接,使用时还需要导入相关数据库的驱动 JAR 包。即mysql-connector-java-5.0.8-bin.jar

16.2.2 创建数据库

在 MySQL 中创建一个名称为 hibernate 的数据库,然后在该数据库中创建一个 user 表,创建数据库和表的 SQL 语句如下所示:

CREATE DATABASE hibernate;
USE hibernate;
CREATE TABLE `user` (
  `id` int(32) PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(20),
  `age` int(4),
  `gender` varchar(4),
)

16.2.3 Hibernate配置文件

编写核心配置文件 hibernate.cfg.xml
Hibernate 映射文件反映了持久化类和数据表的映射信息,而 Hibernate 核心配置文件则用于配置 Hibernate 连接数据库的相关信息,如数据库的驱动、URL、用户名、密码等。
src 目录 下创建一个名称为 hibernate.cfg.xml的文件,如下所示。




    
        
        
            org.hibernate.dialect.MySQL5Dialect
        
        
        
              
        
        
        
            root
        
        
        
            1128
        
        
        
            com.mysql.jdbc.Driver
        
        
        
            true
        
        
        true
        
        
    

元素的常用配置属性

属性 说 明
connection.driver_class 连接数据库的驱动
connection.url 连接数据库的URL地址
connection.username 连接数据库的用户名
connection.password 连接数据库的密码
dialect 设置连接数据库使用的方言
show_sql 是否在控制台打印SQL语句
format_sql 是否格式化SQL语句
hbm2ddl.auto 是否自动生成数据库表

16.2.4 了解并编写持久化类

持久化类是应用程序中的业务实体类,符合基本的 JavaBean 编码规范。Hibernate 操作的持久化类基本上都是普通的 Java 对象(Plain Ordinary Java Object,POJO),这些普通 Java 对象中包含的是与数据库表相对应的各个属性,并且这些属性可以通过 getter 和 setter 方法访问。

public class User {
    private Integer id; // 唯一标识id
    private String name; // 姓名
    private Integer age; // 年龄
    private String gender; // 性别
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

16.2.5 Hibernate映射

映射文件的命名规则为*.hbm.xml,例如持久化类为User.jar,映射文件为User.hbm.xml




    
    
        
        
            
            
        
        
        
        
        
    

持久化映射文件元素的常用配置属性

属性名称 说明
name 持久化类属性的名称,以小写字母开头
column 数据库字段名
type 数据库的字段类型
length 数据库字段定义的长度
not-null 该数据库字段是否可以为空,该属性为布尔变量
unique 该数据库字段是否唯一,该属性为布尔变量
lazy 是否延迟抓取,该属性为布尔变量

16.2.6 Hibernate主键策略

16.2.7 Hibernate 的执行流程过程

Hibernate 的执行流程过程具体如下。

  • 1)创建 Configuration 实例,加载 Hibernate 核心配置文件和映射文件信息到 Configuration 对象中。
  • 2)创建 SessionFactory 实例。通过 Configuration 对象读取到的配置文件信息创建 SessionFactory 对象,该对象中保存了当前数据库的配置信息和所有映射关系等信息。
  • 3)创建 Session 实例,建立数据库连接。Session 主要负责执行持久化对象的增、删、改、查操作,创建一个 Session 就相当于创建一个新的数据库连接。
  • 4)创建 Transaction 实例,开启一个事务。Transaction 用于事务管理,一个 Transaction 对象对应的事务可以包含多个操作。在使用 Hibernate 进行增、删、改操作时,必须先创建 Transaction 对象。需要注意的是,Hibernate 的事务默认是关闭的,需要手动开启事务和关闭事务。
  • 5)利用 Session 接口通过的各种方法进行持久化操作。
  • 6)提交事务,对实体对象持久化操作后,必须提交事务。
  • 7)关闭 Session 与 SessionFactory,断开与数据库的连接。

注意:Hibernate 中的 Session 不同于 JSP 中的 HttpSession。在 Hibernate 中使用 Session 对象时,通常指 Hibernate 中的 Session,而 HttpSession 被称为用户会话 Session。

16.3 Hibernate数据持久化

16.3.1 Hibernate实例状态

  • 1)瞬时态(transient)
    瞬时态也称为临时态或者自由态,瞬时态的对象是由 new 关键字开辟内存空间的对象,不存在持久化标识 OID(相当于主键值),且未与任何的 Session 实例相关联,在数据库中也没有记录,失去引用后将被 JVM 回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系。
  • 2)持久态(persistent)
    持久态的对象存在一个持久化标识 OID,当对象加入到 Session 缓存中时,就与 Session 实例相关联。它在数据库中存在与之对应的记录,每条记录只对应唯一的持久化对象。需要注意的是,持久态对象是在事务还未提交前变成持久态的。
  • 3)脱管态(detached)
    脱管态也称离线态或者游离态,当持久化对象与 Session 断开时就变成了脱管态,但是脱管态依然存在持久化标识 OID,只是失去了与当前 Session 的关联。需要注意的是,脱管态对象发生改变时 Hibernate 是不能检测到的。

16.3.2 Hibernate初始化类

16.3.3 保存数据

16.3.4 查询数据

16.3.5 删除数据

16.3.6 修改数据

16.3.7 关于延迟加载

16.4 使用 Hibernate的缓存

16.4.1 一级缓存的使用

一级缓存其实就是 Session 缓存。Session 缓存是一块内存空间,用于存储与管理 Java 对象。
Hibernate 的一级缓存具有如下特点。

  • 1)当应用程序调用 Session 接口的 save()、update()、saveOrUpdate() 时,如果 Session 缓存中没有相应的对象,则 Hibernate 就会自动把从数据库中查询到的相应对象信息加入到一级缓存中。
  • 2)当调用 Session 接口的 load()、get() 方法,以及 Query 接口的 list()、iterator() 方法时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询的对象,则再去数据库中查询对应对象,并添加到一级缓存中。
  • 3)当调用 Session 的 close() 方法时,Session 缓存会被清空。
  • 4)Session 能够在某些情况下,按照缓存中对象的变化,执行相关的 SQL 语句同步更新数据库,这一过程被称为刷出缓存(flush)。

16.4.2 配置并使用二级缓存

你可能感兴趣的:(JAVA Web学习(22)___第16章Hibernate技术)