一级缓存:
SqlSession opensession=getSqlSessionFactory().openSession();
EmployeeMapperPlus mapper=opensession.getMapper(EmployeeMapperPlus.class);
Employee employee=mapper.getEmpAndDept(1);
System.out.println(employee);
Employee employee1=mapper.getEmpAndDept(1);
System.out.println(employee1);
System.out.println(employee==employee1);
控制台只发送了一次sql,且两个对象是相等的,使用了一级缓存,一级缓存一直是开启的
两次使用的是同一个SqlSessionFactory
可以使用sqlSession的clearCache()方法清除当前的一级缓存
二级缓存:
注意要给实体类实现序列化接口:
开启了二级缓存后,还需要将要缓存的pojo实现Serializable接口,为了将缓存数据取出执行反序列化操作:
public class Employee implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
开启二级缓存:
关闭或开启二级缓存:
在select 标签中 ,通过useCache来操作
<select id="getEmpById" resultMap="My" useCache="false">
select * from employee where id=#{id}
</select>
每个增删改标签中可以设置:flushCache='true'
增删改执行完成后就会清空缓存,一级缓存和二级缓存都会被清除
第三方缓存整合:
mybatis提供有ehcahe的接口,以便使用其他的缓存来应对不同的场景:
导入ehcache-core-2.6.8.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.2.jar
在mapper中配置该缓存:
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
同时有ehcache.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!-- 磁盘保存路径 -->
<diskStore path="D:\44\ehcache" />
<defaultCache
maxElementsInMemory="10000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>