2019-10-31

Hiberante 

1.什么是Hibernate?

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

2.什么是ORM框架?

ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。

3.Hibernate 架构

4.Hibernate 应用程序体系结构常用的类

配置对象

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

数据库连接:由 Hibernate 支持的一个或多个配置文件处理。这些文件是hibernate.propertieshibernate.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 对象被用于创造和执行面向规则查询的对象来检索对象。

5.Hibernate的核心配置文件

5.1属性介绍:

如果您正在使用 JNDI 和数据库应用程序服务器然后您必须配置以下属性:

6. Hibernate 会话

Session 用于获取与数据库的物理连接。 Session 对象是轻量级的,并且设计为在每次需要与数据库进行交互时被实例化。持久态对象被保存,并通过 Session 对象检索找回。

该 Session 对象不应该长时间保持开放状态,因为它们通常不能保证线程安全,而应该根据需求被创建和销毁。Session 的主要功能是为映射实体类的实例提供创建,读取和删除操作。这些实例可能在给定时间点时存在于以下三种状态之一:

瞬时状态: 一种新的持久性实例,被 Hibernate 认为是瞬时的,它不与 Session 相关联,在数据库中没有与之关联的记录且无标识符值。

持久状态:可以将一个瞬时状态实例通过与一个 Session 关联的方式将其转化为持久状态实例。持久状态实例在数据库中没有与之关联的记录,有标识符值,并与一个 Session 关联。

游离状态:一旦关闭 Hibernate Session,持久状态实例将会成为游离状态实例。

如下图所示:


7. Hibernate 映射文件

7.1 解析:

格式:<classname>.hbm.xml保存映射文件。例:Employee.hbm.xml

映射文件是一个以<hibernate-mapping>为根元素的 XML 文件,里面包含所有<class>标签。

<class>标签是用来定义从一个 Java 类到数据库表的特定映射。Java 的类名使用name属性来表示,数据库表明用table属性来表示。

<meta>标签是一个可选元素,可以被用来修饰类。

<id>标签将类中独一无二的 ID 属性与数据库表中的主键关联起来。id 元素中的name属性引用类的性质,column属性引用数据库表的列。type属性保存 Hibernate 映射的类型,这个类型会将从 Java 转换成 SQL 数据类型。

在 id 元素中的<generator>标签用来自动生成主键值。设置 generator 标签中的class属性可以设置native使 Hibernate 可以使用identity,sequencehilo算法根据底层数据库的情况来创建主键。

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

7.2 Hibernate 映射类型

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

7.2.1 原始类型

7.2.2 日期和时间类型

7.2. 3二进制和大型数据对象

7.2.4 JDK 相关类型

8. Hibernate O/R 映射

8.1 集合映射

8. 2 关联映射

8.3 组件映射

作为变量的一员实体类很可能和其它类具有相关关系。如果引用的类没有自己的生命周期并且完全依靠于拥有它的那个实体类的生命周期的话,那么这个引用类因此就可以叫做组件类。

组件集合的映射很可能和正常集合的映射相似,只会有很少的设置上的不同。

9  实体类中的注释介绍:

@Entity 注释

EJB 3 标准的注释包含在javax.persistence包,所以我们第一步需要导入这个包。第二步我们对 Employee 类使用@Entity 注释,标志着这个类为一个实体 bean,所以它必须含有一个没有参数的构造函数并且在可保护范围是可见的。

@Table 注释

@table 注释允许您明确表的详细信息保证实体在数据库中持续存在。

@table 注释提供了四个属性,允许您覆盖的表的名称,目录及其模式,在表中可以对列制定独特的约束。现在我们使用的是表名为 EMPLOYEE。

@Id 和 @GeneratedValue 注释

每一个实体 bean 都有一个主键,你在类中可以用@Id来进行注释。主键可以是一个字段或者是多个字段的组合,这取决于你的表的结构。

默认情况下,@Id 注释将自动确定最合适的主键生成策略,但是你可以通过使用@GeneratedValue注释来覆盖掉它。strategygenerator这两个参数我不打算在这里讨论,所以我们只使用默认键生成策略。让 Hibernate 确定使用哪些生成器类型来使代码移植于不同的数据库之间。

@Column Annotation

@Column 注释用于指定某一列与某一个字段或是属性映射的细节信息。您可以使用下列注释的最常用的属性:

name属性允许显式地指定列的名称。

length属性为用于映射一个值,特别为一个字符串值的列的大小。

nullable属性允许当生成模式时,一个列可以被标记为非空。

unique属性允许列中只能含有唯一的内容

10  Hibernate 查询语言

10.1 HQL查询

Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。 HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。

注意:在 HQL 中一些关键字比如 SELECT ,FROM 和 WHERE 等,是不区分大小写的,但是一些属性比如表名和列名是区分大小写的。

FROM 语句

查询完整的对象,使用from语句

AS 语句

在 HQL 中AS语句能够用来给你的类分配别名,尤其是在长查询的情况下

SELECT 语句

SELECT语句比 from 语句提供了更多的对结果集的控制。

WHERE 语句

如果你想要精确地从数据库存储中返回特定对象,你需要使用 WHERE 语句

ORDER BY 语句

给 HQL 查询结果进行排序

GROUP BY 语句

允许 Hibernate 将信息从数据库中提取出来,并且基于某种属性的值将信息进行编组,通常而言,该语句会使用得到的结果来包含一个聚合值。

使用命名参数

Hibernate 的 HQL 查询功能支持命名参数。这使得 HQL 查询功能既能接受来自用户的简单输入,又无需防御 SQL 注入攻击。

UPDATE 语句

HQL Hibernate 3 较 HQL Hibernate 2,新增了批量更新功能和选择性删除工作的功能。

UPDATE语句能够更新一个或多个对象的一个或多个属性。

DELETE 语句

DELETE语句可以用来删除一个或多个对象。

INSERT 语句

HQL 只有当记录从一个对象插入到另一个对象时才支持INSERT INTO语句。

10.2 Hibernate 标准查询(QBC查询):Query By Criteria

Hibernate 提供了操纵对象和相应的 RDBMS 表中可用的数据的替代方法。一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。 (即通过方法的API查询)

HibernateSession接口提供了createCriteria()方法,可用于创建一个Criteria对象,使当您的应用程序执行一个标准查询时返回一个持久化对象的类的实例。

10.2.1 查询全部

如下所示:返回一个类中的所有对象

10.2.2 对标准的限制(有条件的查询)

你可以使用Criteria对象可用的add()方法去添加一个标准查询的限制

以下是几个例子,涵盖了不同的情况,可按要求进行使用:


10.2.3 使用逻辑表达式创建 AND 或 OR 的条件组合

10.2.4 分页使用标准

使用分页标准接口方法:

利用上述两种方法结合在一起,我们可以在我们的 Web 或 Swing 应用程序构建一个分页组件。以下是一个例子,利用它你可以一次取出 10 行:

10.3 Hibernate 原生 SQL

10.3.1 标量查询

最基本的 SQL 查询是从一个或多个列表中获取一个标量(值)列表。以下是使用原生 SQL 进行获取标量的值的语法:

10.3.2 实体查询

以上的查询都是关于返回标量值的查询,只是基础性地返回结果集中的“原始”值。以下是从原生 SQL 查询中通过 addEntity() 方法获取实体对象整体的语法:

10.3.3 指定 SQL 查询

11. Hibernate 拦截器

11.1 Interceptor 接口

提供了在不同阶段能被调用来进行一些所需要的任务的方法。这些方法是从会话到应用程序的回调函数,允许应用程序检查或操作一个持续对象的属性,在它被保存,更新,删除或上传之前。以下是在 Interceptor 接口中可用的所有方法的列表。

11.2 如何使用拦截器?

可以直接实现Interceptor类或者继承EmptyInterceptor类。并重写拦截器中的方法。


Spring与Hibernate整合

1.导入jar包:

2.创建实体类:

3.创建配置对象:applicationContext.xml

4.创建dao接口及实现类:

5.测试:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容