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

2019-10-14  本文已影响0人  岁月静好浅笑安然

第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 具有以下几点优势。

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的文件,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 指定方言 -->
        <property name="dialect">
            org.hibernate.dialect.MySQL5Dialect
        </property>
        <!-- 链接数据库url -->
        <property name="connection.url">
              <![CDATA[jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf-8]]>
        </property>
        <!-- 连接数据库的用户名 -->
        <property name="connection.username">
            root
        </property>
        <!-- 数据库的密码 -->
        <property name="connection.password">
            1128
        </property>
        <!-- 数据库驱动 -->
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <!-- 显示sql语句 -->
        <property name="show_sql">
            true
        </property>
        <!-- 格式化sql语句 -->
        <property name="format_sql">true</property>
        <!-- 映射文件配置 -->
        <mapping resource="com/mengma/domain/User.hbm.xml" />
    </session-factory>
</hibernate-configuration>

<property>元素的常用配置属性

属性 说 明
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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name代表的是类名,table代表的是表名 -->
    <class name="com.mengma.domain.User" table="user">
        <!-- name代表的是User类中的id属性,column代表的是user表中的主键id -->
        <id name="id" column="id">
            <!-- 主键生成策略 -->
            <generator class="native" />
        </id>
        <!-- 其他属性使用property标签映射 -->
        <property name="name" column="name" type="java.lang.String" />
        <property name="age" type="integer" column="age" />
        <property name="gender" type="java.lang.String" column="gender" />
    </class>
</hibernate-mapping>

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

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

16.2.6 Hibernate主键策略

16.2.7 Hibernate 的执行流程过程

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

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

16.3 Hibernate数据持久化

16.3.1 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 的一级缓存具有如下特点。

16.4.2 配置并使用二级缓存

上一篇 下一篇

猜你喜欢

热点阅读