查询缓存
概念
- 查询缓存就是数据缓存,能够按照要求加载数据
- 一级缓存和二级缓存都是对象缓存,在表中的一行有多少个字段,就会加载多少个数据。
配置
- 建立在二级缓存基础之上的。
- 开启查询缓存12<!-- 开启查询缓存--><property name="cache.use_query_cache">true</property>
操作
案例一
|
|
说明:
当执行第一个查询语句时,是会发出SQL语句的,当执行二个查询的时候,是不会发出SQL语句,因为利用查询缓存。 如下图:
案例二
当进行查询的SQL语句不同的时候,我们来看hibernate的查询缓存是否是会起作用。
hibernate执行SQL语句如下图所示:
说明:
1. 当两次query.lsit的时候,都会发出SQL语句
2. 原因是两次查询的hql语句不一样的,当发出的hql不一样的时候,就会重新发出SQL语句
3. 从这里可以看出查询缓存的命中率是比较低。
案例三
|
|
上述代码中的query.list()
的内存快照如下图:
从list的内存快照中可以看出,list里存放的不是持久化对象,而是name属性的值。
一级缓存和二级缓存存放的是持久化对象,如果集合中存放的不是持久化对象,则不能进入二级缓存中,但是能够进入查询缓存中。
数据缓存和对象缓存
- 一级缓存和二级缓存是对象缓存,只能缓存持久化对象。
- 对象缓存的特点就是要把数据库表中所有的字段全部查询出来。
- 查询缓存是数据缓存,可以查询一个对象的部分属性,而且可以把部分属性放入到查询缓存中,查询缓存也支持对象。
Hql语句
单表
操作
以查询 Classes为例,下面就通过不同的hql语句进行分析,其中要注意的一点是:hql语句和SQL语句有相同的地方,也有不同的地方,比如在from xxx 表,SQL是查询表名字,但是hql 的from后面是接着类名字。
案例一
|
|
查询的内存结构是如下图:
可以看到查询出来的elementData
是一个Object
类型的数组。
案例二
|
|
查询后的list中内存结构如下图:
说明:List中含有Object[], 该数组中有两个元素,第一个元素为Long类型,第二个元素为String类型。
案例三
|
|
在持久化类中,必须有两个构造器
案例四:查询所有的数据个数
|
|
案例五:带参数的查询
|
|
一对多
案例一
对Classes和Studentd持久化类进行查询,当查询语句如下的时候:
根据上述的hql语句查询出的结果集的内存结构如下图所示:
案例二
对Classes和Student持久化类进行如下的hql语句进行查询:
查询结果的内存结构如下图:
采用了左外连接,但是出来的结构不是很好。
案例三
|
|
根据上述hql语句的查询语句进行查询,得到的内存结构如下次图:
说明:在join后面跟fetch,就为迫切左外连接。
案例四
|
|
根据上述的hql语句进行的查询后的结果的内存结构如下图:
案例五
|
|
根据上述的hql语句进行的查询结果的内存结构是如下图:
说明:如果用select,则不能使用fetch,如果用fetch, 则不能使用select。
多对多
案例一
|
|
根据上面的hql语句进行的查询结果的内存结构如下图:
案例二
|
|
根据上面的hql语句进行查询结果的内存结构如下: