1 全局配置需要在mybatis的核心配置文件开启二级缓存
<settings>
<!-- 二级缓存的开启-->
<setting name="cacheEnabled" value="true"/>
</settings>
2 在mapper映射的xml文件中配置如下
<!--配置当前mapper配置-->
<!-- LRU 最近最少使用的,一处最长时间不用的对象
flushInterval 刷新间隔时间,没有配置的时候SQL执行的时候才会刷新缓存。
size 引用数目,代表缓存最多可以存储多少对象,设置过大会溢出。
readOnly 缓存数据只能读取 不能修改。默认为false
-->
<cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"/>
<!--useCache单独给某个方法是否执行二级缓存 -->
<select id="selectById" resultType="video" useCache="true">
select * from video where id=#{video_id}
</select>
3 编写测试类
package com.zxf;
import com.zxf.dao.VideoMapper;
import com.zxf.domain.Video;
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 java.io.IOException;
import java.io.InputStream;
public class SqlSeesionCachDemo {
public static void main(String[] args) throws IOException {
String resource="conf/mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
try {
SqlSession sqlSession1 = sqlSessionFactory.openSession();
VideoMapper videoMapper1 = sqlSession1.getMapper(VideoMapper.class);
Video video = videoMapper1.selectById(60);
System.out.println(video.getTitle());
sqlSession1.commit(); //这里必须有session的commit操作,否则不会执行二级缓存.
SqlSession sqlSession2 = sqlSessionFactory.openSession();
VideoMapper videoMapper2 = sqlSession2.getMapper(VideoMapper.class);
Video video2 = videoMapper2.selectById(60);
System.out.println(video2.getTitle());
}catch (Exception e){
e.printStackTrace();
}
}
}
4运行结果
同一个内容执行2次的时候,只执行了1条SQL语句。大家可以把设置的true编程false看看是否执行了2条SQL语句。在有就是如果session没有commit那么二级缓存也不会生效。
本案例只给出相关的部分代码。如果需要其他部分内容,可以给我留言。
大家在查找和学习中,遇到问题,可以在发布你的评论。