Hibernate查询以及优化策略

Hibernate查询以及优化策略回顾任务目标Hibernate查询Hibernate优化策略一. HQL查询1. HQL单表查询1.1 准备项目1.2 HQL单表基本查询2. HQL多表查询2.1. 多表查询分类2.2 HQL多表查询二. QBC查询1. QBC查询介绍2. QBC查询测试三. 本地SQL查询1. Hibernate使用SQL语句介绍2. Hibernate使用SQL语句四. 延迟加载策略1. 类级别的(属性)延迟加载2. 关联级别的五. 抓取策略1. 查询一方单条记录:<set/>2. 查询一方多条记录: <set/>3. 查询多方的记录: <many-to-one/>Hibernate优化策略六. 整合连接池1. 导入 c3p0 的整合相关包2. 在Hibernate.cfg.xml添加整合配置3. 测试是否启动连接池七.二级缓存1. 添加二级缓存需要实现jar包2. 配置二级缓存3. 测试复习作业面试题

回顾

1. 一对多映射
2. 多对多映射
3. 一对一映射

任务

1. HQL查询
2. QBC查询
3. 本地SQL查询
4. 延迟加载策略
5. 抓取策略
6. 整合连接池
7. 二级缓存

目标

1. 掌握HQL查询
2. 掌握QBC查询
3. 掌握本地SQL查询
4. 掌握延迟加载策略
5. 掌握抓取策略
6. 掌握整合连接池
7. 掌握二级缓存
Hibernate查询
Hibernate优化策略

一. HQL查询

1. HQL单表查询
1.1 准备项目
1.2 HQL单表基本查询
 

2. HQL多表查询
2.1. 多表查询分类

1)内连接查询: inner join

2)左连接查询: left join

3)右连接查询:right join

2.2 HQL多表查询

需求: 同时显示客户名称和订单名称

 

二. QBC查询

1. QBC查询介绍

Query By Criteria 使用 Criteria 对象进行查询

特点:面向对象方式的查询

注意:5.2版本以后被废弃,推荐使用 JPA Criteria

2. QBC查询测试
 

三. 本地SQL查询

1. Hibernate使用SQL语句介绍

本地sql查询可以直接执行 SQL 语句

2. Hibernate使用SQL语句
 

四. 延迟加载策略

延迟加载是为了减少程序和数据库的访问次数,提供程序的执行性能。

延迟加载的执行机制:

1)在查询一个对象的时候,不会到数据库查询对象的属性或者其关联的数据

2)在需要使用到对象的属性或关联数据的才会去查询数据库!

按需加载!

1. 类级别的(属性)延迟加载
 

结论:

load():只有 load 方法才支持类级别的延迟加载

get():get 方法不支持类级别的延迟加载

使用 load() 方法的默认延迟加载策略是延迟加载,可以在配置文件中修改延迟加载策略

 

2. 关联级别的

注意: 测试前先删除前面配置的lazy = "false"

以一对多为例

1)一方:

测试:

 

结论:

类级别默认使用延迟加载策略,如果不想使用延迟加载策略,那么可以在配置文件中修改延迟加载策略:Customer.hbm.xml

 

多方

测试:

 

结论:

类级别默认使用延迟加载策略,如果不想使用延迟加载策略,那么可以在配置文件中修改延迟加载策略:Order.hbm.xml

 

五. 抓取策略

抓取策略,是为了改变 SQL 语句查询的方式,从而提高 SQL 语句查询的效率(优 化 SQL 语句)

可以设置以下三个值:

fetch="select(默认值)|join|subselect"

1. 查询一方单条记录:

在Customer.hbm.xml中配置 fetch="select" 会执行两条sql

 

配置 fetch="join" 会执行一条左外连接的sql语句。

注意:如果配置了join,那么延迟加载就会失效!

 

测试

 

2. 查询一方多条记录:

此时无论设置 fetch="select" 还是 fetch="join" ,都会执行多条sql语句(n+1)

可以设置 fetch="subselect" ,会执行一条带有子查询的sql语句:

 

测试

 

3. 查询多方的记录:

Order.hbm.xml中配置 fetch="select" 会执行两条sql

 

配置 fetch="join" 会执行一条左外连接的sql语句。

注意:如果配置了join,那么延迟加载就会失效!

 

测试:

 
Hibernate优化策略

六. 整合连接池

1. 导入 c3p0 的整合相关包

​ 在hibernate解压目录下 lib/optional/c3p0 中可以找到整合相关的包

​ 如果maven项目,pom配置天机

 

2. 在Hibernate.cfg.xml添加整合配置

在连接数据库参数的后面添加:

 

3. 测试是否启动连接池
 

七.二级缓存

Hibernate 的一级缓存:就是 Session 对象的缓存,而 Session 对象在每次操作之 后都会关闭,那么一级缓存就丢失!

结论 :一级缓存只用于一次业务操作内的缓存。

Hibernate 的二级缓存:就是 SessionFactory 的缓存,二级缓存和 SessionFactory 对象的生命周期是一致的,SessionFactory 不消耗,那么二级缓存的数据就不会 丢失!

结论:二级缓存可以用于多次业务操作的缓存。

注意的问题:

1)Hibernate 一级缓存默认是开启的,而且无法关闭。

2)Hibernate 二级缓存默认是关闭的,如果使用需要开启,而且需要引入第三 方的缓存工具,例如 EhCache 等。

1. 添加二级缓存需要实现jar包

jar包位置: hibernate解压目录下 lib/optional/ehcache下找到相关包!

maven项目,pom文件添加

 

2. 配置二级缓存

在hibernate.cfg.xml中配置以下节点:

  1. property 节点 要放在 mapping 节点的上方

     
  2. class-cache 节点 要放在 mapping 节点的下方

 

3. 测试

使用二级缓存只打印1条sql,不使用二级缓存会打印2条sql

 

复习

1. 一对多映射
2. 多对多映射
3. 一对一映射

作业

参考数据库文件

 

面试题

1. Hibernate查询的几种方式
2. 延迟加载策略
3. 连接池在Hibernate中的使用
4. Hibernate中缓存的分类和作用