缓存
一级缓存
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;
}
}