victory的博客

长安一片月,万户捣衣声

0%

MyBatis | 缓存

缓存

一级缓存

mybatis中的一级缓存默认开启,是SqlSession级别的,即同一个SqlSession对于一个SQL语句执行之后就会存储在缓存中,
下次执行相同的sql,直接从缓存中取。
一级缓存失效的几种情况:
(1)不同的SqlSession对应不同的一级缓存
(2)同一个SqlSession但是查询条件不同
(3)同一个SqlSession两次查询期间执行了任何一次增删改操作,会自动将缓存清空
(4)同一个SqlSession两次查询期间手动清空了缓存

二级缓存

mybatis的二级缓存默认不开启,需要设置:
1)全局配置文件中开启二级缓存
2)需要使用二级缓存的映射文件处使用cache配置缓存
3)POJO需要实现Serializable接口
注意:二级缓存在 SqlSession 关闭或提交之后才会生效
1)全局setting的cacheEnable:
配置二级缓存的开关,一级缓存一直是打开的。
2)select标签的useCache属性:
配置这个select是否使用二级缓存。一级缓存一直是使用的
3)sql标签的flushCache属性:
增删改默认flushCache=true。sql执行以后,会同时清空一级和二级缓存。
查询默认 flushCache=false。
4)sqlSession.clearCache():只是用来清除一级缓存。

1.项目目录

2.EmpMapper.java

public interface EmpMapper {
    .....
    
    //添加员工信息,将0|1-->女|男
    void insertEmp(Emp emp);
    
    //根据eid所组成的字符串进行批量删除
    void deleteMoreEmp(String eids);
 
    //test cache
    //根据eid查询员工信息
    Emp getEmpByEid(String eid);
}

3.EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.atguigu.mapper.EmpMapper">
    <!-- 第三方缓存 -->
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    
     <!-- Emp getEmpByEid(String eid); -->
     <!--
        useCache:配置这个select是否使用二级缓存 
      -->
     <select id="getEmpByEid" resultType="Emp" useCache="true">
        <include refid="empColumns"></include> where eid=#{eid}
     </select>
</mapper>

4.TestCache.java

package com.atguigu.test;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper;

public class TestCache {
    @Test
    public void testFirstCache() throws Exception{
        //测试一级缓存
        //同一个SqlSession
//        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//        SqlSession sqlSession = sqlSessionFactory.openSession(true);
//        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//        Emp emp1 = mapper.getEmpByEid("8");
//        System.out.println(emp1);
//        System.out.println("===================");
//        Emp emp2 = mapper.getEmpByEid("8");
//        System.out.println(emp2);
        
//        DEBUG 04-14 16:23:56,710 ==>  Preparing: select eid,ename,age,sex,did from emp where eid=?   (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:23:56,726 ==> Parameters: 8(String)  (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:23:56,738 <==      Total: 1  (BaseJdbcLogger.java:145) 
//        Emp [eid=8, ename=小红, age=11, sex=0, dept=null]
//        ===================
//        Emp [eid=8, ename=小红, age=11, sex=0, dept=null]
        
        
        //不同SqlSession
//        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
//        EmpMapper mapper1 = sqlSession1.getMapper(EmpMapper.class);
//        Emp emp1 = mapper1.getEmpByEid("8");
//        System.out.println(emp1);
//        
//        System.out.println("===================");
//        
//        SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
//        EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class);
//        Emp emp2 = mapper2.getEmpByEid("8");
//        System.out.println(emp2);
        
//        DEBUG 04-14 16:26:44,934 ==>  Preparing: select eid,ename,age,sex,did from emp where eid=?   (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:26:44,950 ==> Parameters: 8(String)  (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:26:44,961 <==      Total: 1  (BaseJdbcLogger.java:145) 
//        Emp [eid=8, ename=小红, age=11, sex=0, dept=null]
//        ===================
//        DEBUG 04-14 16:26:44,966 ==>  Preparing: select eid,ename,age,sex,did from emp where eid=?   (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:26:44,966 ==> Parameters: 8(String)  (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:26:44,967 <==      Total: 1  (BaseJdbcLogger.java:145) 
//        Emp [eid=8, ename=小红, age=11, sex=0, dept=null]
        
        //同一个SqlSession两次查询期间执行了任何一次增删改操作
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
        EmpMapper mapper1 = sqlSession1.getMapper(EmpMapper.class);
        Emp emp1 = mapper1.getEmpByEid("8");
        System.out.println(emp1);
        
        sqlSession1.clearCache();
        System.out.println("===================");
//        Emp emp = new Emp();
//        emp.setEid(null);
//        emp.setAge(25);
//        emp.setEname("lisi");
//        mapper1.insertEmp(emp);
        
        EmpMapper mapper2 = sqlSession1.getMapper(EmpMapper.class);
        Emp emp2 = mapper2.getEmpByEid("8");
        System.out.println(emp2);
//        DEBUG 04-14 16:39:56,334 ==>  Preparing: select eid,ename,age,sex,did from emp where eid=?   (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:39:56,350 ==> Parameters: 8(String)  (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:39:56,361 <==      Total: 1  (BaseJdbcLogger.java:145) 
//        Emp [eid=8, ename=小红, age=11, sex=0, dept=null]
//        ===================
//        DEBUG 04-14 16:39:56,362 ==>  Preparing: select eid,ename,age,sex,did from emp where eid=?   (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:39:56,363 ==> Parameters: 8(String)  (BaseJdbcLogger.java:145) 
//        DEBUG 04-14 16:39:56,364 <==      Total: 1  (BaseJdbcLogger.java:145) 
//        Emp [eid=8, ename=小红, age=11, sex=0, dept=null]
    }
    
    @Test
    public void testSecondCache() throws Exception{
        
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper1 = sqlSession.getMapper(EmpMapper.class);
        Emp emp1 = mapper1.getEmpByEid("8");
        System.out.println(emp1);
        sqlSession.commit();//二级缓存在 SqlSession 关闭或提交之后才会生效
        System.out.println("====================");
        EmpMapper mapper2 = sqlSession.getMapper(EmpMapper.class);
        Emp emp2 = mapper2.getEmpByEid("8");
        System.out.println(emp2);

    }
    
    public SqlSessionFactory getSqlSessionFactory() throws Exception{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        return sqlSessionFactory;
    }
}