Hibernate

概述

Hibernate 是一个高性能的对象关系型持久化存储和查询的服务.
Hibernate 不仅关注于从 Java 类到数据库表的映射,也有 Java 数据类型到 SQL 数据类型的映射,另外也提供了数据查询和检索服务。

对象关系映射(ORM)

是一个方便在关系数据库和类似于 Java, C# 等面向对象的编程语言中转换数据的技术
当我们工作在一个面向对象的系统中时,存在一个对象模型和关系数据库不匹配的问题。RDBMSs 用表格的形式存储数据,然而像 Java 或者 C# 这样的面向对象的语言它表示一个对象关联图。

  • 粒度
    有时你将会有一个对象模型,该模型类的数量比数据库中关联的表的数量更多
  • 继承
    RDBMSs 不会定义任何在面向对象编程语言中本来就有的继承
  • 身份
    RDBMS 明确定义一个 ‘sameness’ 的概念:主键。然而,Java 同时定义了对象判等(a==b)和 对象值判等(a.equals(b))
  • 关联
    面向对象的编程语言使用对象引用来表示关联,而一个 RDBMS 使用外键来表示对象关联
  • 导航
    在 Java 中和在 RDBMS 中访问对象的方式完全不相同

Object-Relational Mapping (ORM) 是解决以上所有不匹配问题的方案。

Hibernate

  • 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码
  • 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性
  • 不需要应用程序服务器来操作
    这里写图片描述

配置对象

配置对象是应用程序中创造的第一个Hibernate 对象,在应用程序初始化期间创造。
配置对象提供了两种基础组件。

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

  • SessionFactory 对象
    允许实例化一个会话对象。
    SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。
    SessionFactory 是一个重量级对象通常创造后留存为以后使用。
    每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。

  • Session 对象
    一个会话被用于与数据库的物理连接。
    Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。
    持久对象通过 Session 对象保存和检索。
    Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全
    它们应该按照所需创造和销毁。

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

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

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

Hibernate 会话

  • 该 Session 对象不应该长时间保持开放状态,因为它们通常不能保证线程安全,而应该根据需求被创建和销毁。
  • Session 的主要功能是为映射实体类的实例提供创建,读取和删除操作。
  • Session 实例的持久态类别是序列化的,则该 Session 实例是序列化的

Hibernate 持久化类

  • 其对象或实例将会被存储在数据库表单中的 Java 类被称为持久化类

持久化类的主要规则(非硬性)

  • 所有将被持久化的 Java 类都需要一个默认的构造函数。
  • 为了使对象能易识别,所有类都需要包含一个 ID。此属性映射到数据库表的主键列。
  • 所有将被持久化的属性都应该声明为 private,并具有由 JavaBean 风格定义的 getXXX 和 setXXX 方法。
  • 所有的类是不可扩展或按 EJB 要求实现的一些特殊的类和接口。

Hibernate 映射文件

  • 一个对象/关系型映射一般定义在 XML 文件中。
  • 映射文件指示 Hibernate 如何将已经定义的类或类组与数据库中的表对应起来。
  • 以格式 < classname >.hbm.xml保存映射文件。
标签
  • 映射文件是一个以 < hibernate-mapping> 为根元素的 XML 文件
  • < class> 标签是用来定义从一个 Java 类到数据库表的特定映射。
    Java 的类名使用 name 属性来表示,数据库表明用 table 属性来表示。
  • < meta > 标签是一个可选元素,可以被用来修饰类。
  • < id > 标签将类中独一无二的 ID 属性与数据库表中的主键关联起来。
    id 元素中的 name 属性引用类的性质,column 属性引用数据库表的列。type 属性保存 Hibernate 映射的类型,这个类型会将从 Java 转换成 SQL 数据类型。
  • 在 id 元素中的 < generator > 标签用来自动生成主键值。
    设置 generator 标签中的 class 属性可以设置 native 使 Hibernate 可以使用 identity, sequence 或 hilo 算法根据底层数据库的情况来创建主键。

  • < property > 标签用来将 Java 类的属性与数据库表的列匹配。
    标签中 name 属性引用的是类的性质,column 属性引用的是数据库表的列。type 属性保存 Hibernate 映射的类型,这个类型会将从 Java 转换成 SQL 数据类型。

Hibernate 映射类型

准备一个 Hibernate 映射文件时,把 Java 数据类型映射到了 RDBMS 数据格式。在映射文件中已经声明被使用的 types 不是 Java 数据类型;它们也不是 SQL 数据库类型。这种类型被称为 Hibernate 映射类型,可以从 Java 翻译成 SQL,反之亦然。

EJB

  • 容器类框架
  • EJB有3中类型:Session–实现业务逻辑, Entity–实现O/R映射和Message-driven
  • 设计目标与核心应用是部署分布式应用程序

Java Bean

  • 实体类,可重用组件
  • 提供一个默认的无参构造函数。
  • 需要被序列化并且实现了Serializable接口。
  • 可能有一系列可读写属性。
  • 可能有一系列的”getter”或”setter”方法。

POJO

  • 所有正常的 Java 对象都是 POJO。
  • 这种对象不会扩展或者执行一些特殊的类并且它的接口都是分别在 EJB 框架的要求下的
  • POJO 的名称用于强调一个给定的对象是普通的 Java 对象,而不是特殊的对象,尤其不是一个 Enterprise JavaBean
  • 理想地讲,一个POJO是一个不受任何限制的Java对象

Hibernate实例

  • 创建 POJO 类
  • 创建数据库表
  • 创建映射配置文件
  • 创建应用程序类
  • 编译和执行

Hibernate 注释

Hibernate 注释是无需使用 XML 文件来定义映射的最新方法。
可以额外使用注释或直接代替 XML 映射元数据。

  • 环境设置
  • 设置注释
    @Entity 注释
    对类使用 @Entity 注释,标志着这个类为一个实体 bean
    @Table 注释
    明确表的详细信息保证实体在数据库中持续存在。
    @Id 和 @GeneratedValue 注释
    每一个实体 bean 都有一个主键,可以用 @Id 来进行注释。
    @Column Annotation
    @Column 注释用于指定某一列与某一个字段或是属性映射的细节信息

  • 创建应用类

  • 数据库配置
  • 编译和执行

Hibernate 查询语言

  • 类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。
  • HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。
  • 尽可能使用 HQL 语句,以避免数据库关于可移植性的麻烦
  • 由于 HQL 是完全面向对象的查询语句,因此可以支持继承、多态.
执行步骤

1、获得 Hibernate Session 对象
2、编写 HQL 语句
3、调用 Session 的 createQuery() 方法创建查询对象
4、如果 HQL 语句包含参数,则调用 Query 的 setXxx 方法为参数赋值
5、调用 Query 对象的 list 等方法返回查询结果。

Hibernate 缓存

缓存是关于应用程序性能的优化,降低了应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。
这里写图片描述

一级缓存

  • 第一级缓存是 Session 缓存,并且是一种强制性缓存。
  • Session对象在它自己的权利之下,在将它提交给数据库之前保存一个对象。
  • 如果对一个对象发出多个更新,Hibernate 会尝试尽可能长地延迟更新来减少发出的 SQL 更新语句的数目

二级缓存

  • 第二级缓存是一种可选择的缓存并且第一级缓存在任何想要在第二级缓存中找到一个对象前将总是被询问。

Hibernate 批处理

<property name="hibernate.jdbc.batch_size">50</property>
  • 设置 hibernate.jdbc.batch_size 作为批处理的尺寸,取一个依赖于对象尺寸的值
  • 这将告诉 hibernate 容器每 X 行为一批插入
Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Employee employee = new Employee(.....);
    session.save(employee);
    if( i % 50 == 0 ) { // Same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}
tx.commit();
session.close();

Hibernate 拦截器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值