Hibernate框架之查询缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/ip_JL/article/details/82817941
今日推荐