Hibernate_day04
Hibernate_day04
上节内容
1 表与表之间关系回顾
(1)一对多(客户和联系人)
(2)多对多(用户和角色)
2 hibernate一对多操作
(1)一对多映射配置
(2)一对多级联保存
(3)一对多级联删除
(
4
)
inverse
属性
3 hibernate多对多操作
(1)多对多映射配置
(2)多对多级联保存(重点)
(
3
)
多对多级联删除(了解)
(4)维护第三张表
今天内容
1 hibernate的查询方式
2 对象导航查询
3 hql查询
(1)查询所有
(2)条件查询
(3)排序查询
(4)分页查询
(5)投影查询
(6)聚集函数使用
4 qbc查询
(1)查询所有
(2)条件查询
(3)排序查询
(4)分页查询
(5)统计查询
(6)离线查询
5 hql多表查询
(1)mysql多表查询回顾
(2)hql多表查询
-
内连接、迫切内连接、左外连接、迫切左外连接、右外连接
6 hibernate的检索策略
(1)概念
- hibernate
分成 :立即和延迟查询
-
延迟查询分成:类级别和关联级别延迟
(2)具体操作
H
ibernate
查询方式
1
对象导航查询
(
1
)根据
id
查询某个客户,再查询这个客户里面所有的联系人
2 OID
查询
(
1
)根据
id
查询某一条记录,返回对象
3 HQL
查询
(
1
)
Query
对象,写
hql
语句实现查询
4 QBC
查询
(
1
)
Criteria
对象
5
本地
sql
查询
(
1
)
SQLQuery
对象,使用普通
sql
实现查询
对象导航查询
1
查询某个客户里面所有联系人过程,使用对象导航实现
2
代码
OID
查询
1
根据
id
查询记录
(
1
)调用
session
里面的
get
方法实现
HQL
查询
1 hql
:
hibernate query language
,
hibernate
提供一种查询语言,
hql
语言和普通
sql
很相似,区别:普通
sql
操作数据库表和字段,
hql
操作实体类和属性
2
常用的
hql
语句
(
1
)查询所有:
from
实体类名称
(
2
)条件查询:
from
实体类名称
where
属性名称
=?
(
3
)排序查询:
from
实体类名称
order by
实体类属性名称
asc/desc
3
使用
hql
查询操作时候,使用
Query
对象
(
1
)创建
Query
对象,写
hql
语句
(
2
)调用
query
对象里面的方法得到结果
查询所有
1
查询所有客户记录
(
1
)创建
Query
对象,写
hql
语句
(
2
)调用
query
对象里面的方法得到结果
2
查询所有:
from
实体类名称
条件查询
1 hql
条件查询语句写法:
(
1
)
from
实体类名称
where
实体类属性名称
=? and
实体类属性名称
=?
from
实体类名称
where
实体类属性名称
like ?
2
代码
模糊查询
排序查询
1 hql
排序语句写法
(
1
)
from
实体类名称
order by
实体类属性名称
asc/desc
分页查询
1 mysql
实现分页
(
1
)使用关键字
limit
实现
2
在
hql
中实现分页
(
1
)在
hql
操作中,在语句里面不能写
limit
,
hibernate
的
Query
对象封装两个方法实现分页操作
投影查询
1
投影查询:查询不是所有字段值,而是部分字段的值
2
投影查询
hql
语句写法:
(
1
)
select
实体类属性名称
1,
实体类属性名称
2 from
实体类名称
(
2
)
select
后面不能写
*
,不支持的
3
具体实现
聚集函数使用
1
常用的聚集函数
(
1
)
count
、
sum
、
avg
、
max
、
min
2 hql
聚集函数语句写法
(
1
)查询表记录数
- select count(*) from
实体类名称
QBC
查询
1
使用
hql
查询需要写
hql
语句实现,但是使用
qbc
时候,不需要写语句了,使用方法实现
2
使用
qbc
时候,操作实体类和属性
3
使用
qbc
,使用
Criteria
对象实现
查询所有
1
创建
Criteria
对象
2
调用方法得到结果
条件查询
1
没有语句,使用封装的方法实现
排序查询
分页查询
开始位置计算公式: (当前页
-1
)
*
每页记录数
统计查询
离线查询
1 servlet
调用
service
,
service
调用
dao
(
1
)在
dao
里面对数据库
crud
操作
(
2
)在
dao
里面使用
hibernate
框架,使用
hibernate
框架时候,调用
session
里面的方法实现功能
(
3
)在后面
ssh
练习中具体应用
HQL
多表查询
M
ysql
里面多表查询
1
内连接
2
左外连接
3
右外连接
HQL
实现多表查询
Hql
多表查询
(
1
)内连接
(
2
)左外连接
(
3
)右外连接
(
4
)迫切内连接
(
5
)迫切左外连接
HQL
内连接
1
内连接查询
hql
语句写法:以客户和联系人为例
(
1
)
from Customer c inner join
c.setLinkMan
返回
list
,
list
里面每部分是数组形式
2
演示迫切内连接
(
1
)迫切内连接和内连接底层实现一样的
(
2
)区别:使用内连接返回
list
中每部分是数组,迫切内连接返回
list
每部分是对象
(
3
)
hql
语句写法
- from Customer c inner join fetch c.setLinkMan
HQL
左外连接
1
左外连接
hql
语句:
(
1
)
from Customer c left outer join
c.setLinkMan
(
2
)迫切左外连接
from Customer c left outer join fetch
c.setLinkMan
2
左外连接返回
list
中每部分是数组,迫切左外连接返回
list
每部分是对象
1
右外连接
hql
语句:
(
1
)
from Customer c right outer join
c.setLinkMan
H
ibernate
检索策略
检索策略的概念
1 hibernate
检索策略分为两类:
(
1
)立即查询:根据
id
查询,调用
get
方法,一调用
get
方法马上发送语句查询数据库
(
2
)延迟查询:根据
id
查询,还有
load
方法,调用
load
方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库
2
延迟查询分成两类:
(
1
)类级别延迟:根据
id
查询返回实体类对象,调用
load
方法不会马上发送语句
(
2
)关联级别延迟:
-
查询某个客户,再查询这个客户的所有联系人,查询客户的所有联系人的过程是否需要延迟,这个过程称为关联级别延迟
(默认就是这样)
关联级别延迟操作
1
在映射文件中进行配置实现
(
1
)根据客户得到所有的联系人,在客户映射文件中配置
2
在
set
标签上使用属性
(
1
)
fetch
:值
select
(默认)
(
2
)
lazy
:值
- true
:延迟(默认)
- false
:不延迟
- extra
:极其延迟
(
1
)调用
get
之后,发送两条
sql
语句
(
1
)极其懒惰,要什么值给什么值
批量抓取
1
查询所有的客户,返回
list
集合,遍历
list
集合,得到每个客户,得到每个客户的所有联系人
(
1
)上面操作代码,发送多条
sql
语句
2
在客户的映射文件中,
set
标签配置
(
1
)
batch-size
值,值越大发送语句越少