Mybatis的一级和二级缓存

版权声明:本文为博主原创文章,版权归原作者小思所有,转载或者引用本文内容请注明来源及原作者 https://blog.csdn.net/zeal9s/article/details/83823869

作用域

一级缓存:session,当openSession()之后,如果执行相同的sql(相同的语句和参数),Mybatis不执行sql,而是从缓存中返回
二级缓存:mapper的一个namespace,同一个namespace中查询sql可以从缓存中获取,二级缓存可以跨session

一级缓存关闭:

package com.zs.test;

import com.zs.dao.ProvinceDao;
import com.zs.entity.Province;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author 小思
 * @PackageName:com.zs.test
 * @ClassName: TestOneToMany
 * @Description:
 * @date 2018/10/31 16:42
 */
@SuppressWarnings("unused")
public class TestOneToMany {
    SqlSessionFactory sessionFactory;
    SqlSession session;

    @Before
    public void before() {
        //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory
        sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));
        //通过工厂获取SqlSession
        session = sessionFactory.openSession();
    }


    @Test
    public void testProvince() {
        // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法
        ProvinceDao pd = session.getMapper(ProvinceDao.class);
        //查询所有的省份
        List<Province> list = pd.getAllProvince();
        for (Province p : list) {
            System.out.println(p.getPname());
        }
        session.commit();
        session.close();

        System.out.println("-----------------------------------------------------------------------------------------");
        //通过工厂获取SqlSession
        session = sessionFactory.openSession();
        ProvinceDao pd2 = session.getMapper(ProvinceDao.class);
        //第二次查询所有的省份
        List<Province> list2 = pd2.getAllProvince();
        for (Province p : list2) {
            System.out.println(p.getPname());
        }




    }

    @After
    public void after() {
        //提交session和关闭session(释放无用资源)
//        session.commit();
//        session.close();
    }
}

在这里插入图片描述
两条同样的sql语句,控制台输出了两次语句
一级缓存开启:(session不关闭的情况下查询两次同样的sql)
TestOneToMany.java

package com.zs.test;

import com.zs.dao.ProvinceDao;
import com.zs.entity.Province;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author 小思
 * @PackageName:com.zs.test
 * @ClassName: TestOneToMany
 * @Description:
 * @date 2018/10/31 16:42
 */
@SuppressWarnings("unused")
public class TestOneToMany {
    SqlSessionFactory sessionFactory;
    SqlSession session;

    @Before
    public void before() {
        //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory
        sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));
        //通过工厂获取SqlSession
        session = sessionFactory.openSession();
    }


    @Test
    public void testProvince() {
        // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法
        ProvinceDao pd = session.getMapper(ProvinceDao.class);

        //查询所有的省份
        List<Province> list = pd.getAllProvince();
        for (Province p : list) {
            System.out.println(p.getPname());
        }
        System.out.println("-------------------------------------------------");
        //第二次查询所有的省份
        List<Province> list2 = pd.getAllProvince();
        for (Province p : list2) {
            System.out.println(p.getPname());
        }




    }

    @After
    public void after() {
        //提交session和关闭session(释放无用资源)
//        session.commit();
//        session.close();
    }
}


控制台输出,没有发送两句的sql语句,第二次查询是从缓存中获取的。
在这里插入图片描述

二级缓存关闭:
TestOneToMany.java(在同一个sqlSesssionFatory同时开启session,再关闭一次session在开启session)

package com.zs.test;

import com.zs.dao.ProvinceDao;
import com.zs.entity.Province;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author 小思
 * @PackageName:com.zs.test
 * @ClassName: TestOneToMany
 * @Description:
 * @date 2018/10/31 16:42
 */
@SuppressWarnings("unused")
public class TestOneToMany {
    SqlSessionFactory sessionFactory;
    SqlSession session;

    @Before
    public void before() {
        //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory
        sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));
        //通过工厂获取SqlSession
        session = sessionFactory.openSession();
    }


    @Test
    public void testProvince() {
        // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法
        ProvinceDao pd = session.getMapper(ProvinceDao.class);
        //查询所有的省份
        List<Province> list = pd.getAllProvince();
        for (Province p : list) {
            System.out.println(p.getPname());
        }
        session.commit();
        session.close();

        System.out.println("-----------------------------------------------------------------------------------------");
        //通过工厂获取SqlSession
        session = sessionFactory.openSession();
        ProvinceDao pd2 = session.getMapper(ProvinceDao.class);
        //第二次查询所有的省份
        List<Province> list2 = pd2.getAllProvince();
        for (Province p : list2) {
            System.out.println(p.getPname());
        }




    }

    @After
    public void after() {
        //提交session和关闭session(释放无用资源)
//        session.commit();
//        session.close();
    }
}

在这里插入图片描述
二级缓存开启

(1)实体类的映射文件中开启二级缓存
在这里插入图片描述
(2)需要二级缓存的实体类实现序列化
在这里插入图片描述
TestOneToMany.java(在同一个sqlSesssionFatory同时开启session,再关闭一次session在开启session)

package com.zs.test;

import com.zs.dao.ProvinceDao;
import com.zs.entity.Province;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author 小思
 * @PackageName:com.zs.test
 * @ClassName: TestOneToMany
 * @Description:
 * @date 2018/10/31 16:42
 */
@SuppressWarnings("unused")
public class TestOneToMany {
    SqlSessionFactory sessionFactory;
    SqlSession session;

    @Before
    public void before() {
        //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory
        sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));
        //通过工厂获取SqlSession
        session = sessionFactory.openSession();
    }


    @Test
    public void testProvince() {
        // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法
        ProvinceDao pd = session.getMapper(ProvinceDao.class);
        //查询所有的省份
        List<Province> list = pd.getAllProvince();
        for (Province p : list) {
            System.out.println(p.getPname());
        }
        session.commit();
        session.close();

        System.out.println("-----------------------------------------------------------------------------------------");
        //通过工厂获取SqlSession
        session = sessionFactory.openSession();
        ProvinceDao pd2 = session.getMapper(ProvinceDao.class);
        //第二次查询所有的省份
        List<Province> list2 = pd2.getAllProvince();
        for (Province p : list2) {
            System.out.println(p.getPname());
        }




    }

    @After
    public void after() {
        //提交session和关闭session(释放无用资源)
//        session.commit();
//        session.close();
    }
}

控制台只会输出一条sql语句
在这里插入图片描述

说在最后的话:编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

猜你喜欢

转载自blog.csdn.net/zeal9s/article/details/83823869