一. 知识储备
mybatis-config.xml
<!-- 开启二级缓存的使用 -->
<setting name="cacheEnabled" value="true"/>
EmployeeMapperCache.java
package com.atguigu.mybatis.dao;
import com.atguigu.mybatis.beans.Employee;
public interface EmployeeMapperCache {
public Employee selectEmployeeById(Integer id);
}
EmployeeMapperCache.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.mybatis.dao.EmployeeMapperCache">
<!-- 配置使用二级缓存 -->
<cache></cache>
<!-- public Employee selectEmployeeById(Integer id); -->
<select id="selectEmployeeById" resultType="com.atguigu.mybatis.beans.Employee">
select id, last_name, email, gender from tbl_employee where id = #{id}
</select>
</mapper>
TestMyBatisCache.java
/**
* 二级缓存(全局缓存):
* 1. 二级缓存是需要配置来使用的。
* cacheEnabled=true
* 2.二级缓存是一个namespace级别的缓存,可以让多个SqlSession共享同一个二级缓存
* 3.二级缓存的使用:
* 在要使用二级缓存的映射文件中,加入<cache>标签
* POJO类需要实现序列化接口
* 4.二级缓存的工作机制:
* 基于同一个namespace的多个SqlSession:
* 一个SqlSession查询了一条数据,这条数据会存放到当前SqlSession对象的一级缓存中。
* 当前的SqlSession进行提交或关闭操作,才会把一级缓存中的数据存放到二级缓存中。
* 其他的SqlSession再进行查询时,就可以从二级缓存中获取数据。
*
*/
@Test
public void testSecondLevelCache() throws Exception{
SqlSessionFactory ssf = getSqlSessionFactory();
SqlSession session = ssf.openSession();
SqlSession session1 = ssf.openSession();
try {
EmployeeMapperCache mapper = session.getMapper(EmployeeMapperCache.class);
EmployeeMapperCache mapper1 = session1.getMapper(EmployeeMapperCache.class);
Employee employee1 = mapper.selectEmployeeById(1001);
System.out.println("employee1:" + employee1);
System.out.println("------------------------------------------");
session.commit();
Employee employee2 = mapper1.selectEmployeeById(1001);
System.out.println("employee2:" + employee2);
} finally {
// TODO: handle finally clause
session.close();
session1.close();
}
}