1. 程式人生 > >Mybatis的一級和二級快取

Mybatis的一級和二級快取

作用域

一級快取: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語句
在這裡插入圖片描述

說在最後的話:編寫實屬不易,若喜歡或者對你有幫助記得點贊+關注或者收藏哦~