版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ip_JL/article/details/82817941
一级缓存跟二级缓存都只能缓存实体对象, 而查询缓存可以缓存基本属性, 同时查询缓存也可以缓存实体对象, 但是只能缓存其id
查询缓存的生命周期是: 一旦数据库表的数据发生修改, 则查询缓存则被清掉了
直接使用Hibernate框架提供的查询缓存即可
第一步: 开启查询缓存总开关
"hibernate.cfg.xml"配置文件:
<!-- 手动开启查询缓存
-->
<property name="hibernate.cache.use_query_cache">true</property>
第二步: 在测试类中具体开启查询缓存的开关:
测试代码:
package com.rl.hiber.test;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.Test;
import com.rl.hiber.model.User;
import com.rl.hiber.utils.HibernateUtils;
public class TestHibernate6 {
@Test
public void query1(){
Session session = HibernateUtils.getSession();
try {
Query query = session.createQuery("select u.uname from User u where u.userId = 1");
//开启查询缓存
query.setCacheable(true);
//发出sql
String name = (String)query.uniqueResult();
System.out.println(name);
} finally{
HibernateUtils.closeSession(session);
}
Session session2 = HibernateUtils.getSession();
try {
Query query = session2.createQuery("select u.uname from User u where u.userId = 1");
//开启查询缓存
query.setCacheable(true);
//不发出sql
String name = (String)query.uniqueResult();
System.out.println(name);
} finally{
HibernateUtils.closeResource(session2);
}
}
/**
* 查询缓存支持list方法
*/
@Test
public void query2(){
Session session = HibernateUtils.getSession();
try {
Query query = session.createQuery("select u.uname from User u");
//开启查询缓存
query.setCacheable(true);
//发出sql
List<String> nameList = query.list();
for(String name: nameList){
System.out.println(name);
}
} finally{
HibernateUtils.closeSession(session);
}
Session session2 = HibernateUtils.getSession();
try {
Query query = session2.createQuery("select u.uname from User u");
//开启查询缓存
query.setCacheable(true);
//不发出sql
List<String> nameList = query.list();
for(String name: nameList){
System.out.println(name);
}
} finally{
HibernateUtils.closeResource(session2);
}
}
/**
* 查询缓存不支持iterate方法
*/
@Test
public void query3(){
Session session = HibernateUtils.getSession();
try {
Query query = session.createQuery("select u.uname from User u");
//开启查询缓存
query.setCacheable(true);
//发出sql
Iterator<String> iterator = query.iterate();
while(iterator.hasNext()){
String name = iterator.next();
System.out.println(name);
}
} finally{
HibernateUtils.closeSession(session);
}
Session session2 = HibernateUtils.getSession();
try {
Query query = session2.createQuery("select u.uname from User u");
//开启查询缓存
query.setCacheable(true);
//发出sql
Iterator<String> iterator = query.iterate();
while(iterator.hasNext()){
String name = iterator.next();
System.out.println(name);
}
} finally{
HibernateUtils.closeResource(session2);
}
}
/**
* 严格来讲查询缓存并不支持缓存实体对象
* 能够缓存对象的id
*/
@Test
public void query4(){
Session session = HibernateUtils.getSession();
try {
Query query = session.createQuery("from User");
//开启查询缓存
query.setCacheable(true);
//发出一条sql查询全部
List<User> userList = query.list();
for(User user: userList){
System.out.println(user);
}
} finally{
HibernateUtils.closeSession(session);
}
Session session2 = HibernateUtils.getSession();
try {
Query query = session2.createQuery("from User");
//开启查询缓存
query.setCacheable(true);
//根据缓存进来的id查询具体每一条数据
List<User> userList = query.list();
for(User user: userList){
System.out.println(user);
}
} finally{
HibernateUtils.closeResource(session2);
}
}
/**
* 结合二级缓存的iterate方法
* 利用iterate在二级缓存中查询对象的全部id的特点
* 此时结合查询缓存则能起到从缓存中读取数据的功能
*/
@Test
public void query5(){
Session session = HibernateUtils.getSession();
try {
Query query = session.createQuery("select u from User u");
//开启查询缓存
query.setCacheable(true);
//发出sql
Iterator<User> iterator = query.iterate();
while(iterator.hasNext()){
//发出根据id来查询的sql
User user = iterator.next();
System.out.println(user);
}
} finally{
HibernateUtils.closeSession(session);
}
Session session2 = HibernateUtils.getSession();
try {
Query query = session2.createQuery("select u from User u");
//开启查询缓存
query.setCacheable(true);
//发出sql查询出所有的id
Iterator<User> iterator = query.iterate();
while(iterator.hasNext()){
//不发出sql
User user = iterator.next();
System.out.println(user);
}
} finally{
HibernateUtils.closeResource(session2);
}
}
}