Mybatis默认只开启了一级缓存(SqlSession级),没有开启二级缓存(SqlSessionFactory级),需要开启的话,可以在Mapper文件中写上
<cache/>
缓存开启后:
1.需要使用SqlSession::commit()方法才会提交操作
2.如果resultType是一个POJO类,那么需要实现Serializeable接口
没有特定配置的情况下:
如果使用select操作,会优先从缓存读取值
如果使用了insert、update、delete等操作,会刷新缓存
也可以使用flushCache或useCache进行控制
例如:
<select id="…" resultType="…" parameterType="…" useCache="false">……</select>
就不会从二级缓存读取
<insert id="…" parameterType="…" flushCache="false">……</insert>
就不会刷新缓存
cache标签的高级属性:
- eviction:回收策略,有LRU、FIFO、SOFT、WEAK等
- flushInterval:刷新间隔,单位ms
- size:缓存大小(个)
- readOnly:是否允许修改
- type:缓存类型,用来使用自定义缓存
自定义缓存
Mybatis缓存是基于HashMap实现的(org.apache.ibatis.cache.impl.PerpetualCache类),如果想用更高级的缓存(比如Redis),需要自己实现
方法:实现Cache接口
接口如下:
package org.apache.ibatis.cache;
import java.util.concurrent.locks.ReadWriteLock;
public interface Cache {
String getId();
void putObject(Object var1, Object var2);
Object getObject(Object var1);
Object removeObject(Object var1);
void clear();
int getSize();
ReadWriteLock getReadWriteLock();
}
实现以后,将实现类配置到cache标签的type属性即可