1.一级缓存
一级缓存是SqlSession级别的缓存,Mybatis默认是开启的,当调用SqlSession的修改、添加、删除、commit()、close()等方法时,就会清空一级缓存。
2.二级缓存
二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句是共用二级缓存的,二级缓存是跨SqlSession的。
3.使用二级缓存
在全局配置文件SqlMapConfig.xml中的settings标签中开启二级缓存:
<!-- 开启二级缓存,cacheEnabled默认是true,所以这一步可忽略 --> <setting name="cacheEnabled" value="true"/>
然后编写实体类,这里以User表为例,代码可参考:IDEA中Maven工程的MyBatis快速入门。然后编写实体类对应的UserMapper.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.gqzzw.mapper.UserMapper"> <!-- useCache属性为true代表该sql语句使用二级缓存 --> <select id="findById" resultType="com.gqzzw.domain.User" parameterType="int" useCache="true"> select * from user where id=#{id}; </select> <!-- cache标签代表该mapper启用二级缓存 --> <cache></cache> </mapper>
编写测试类:
package com.gqzzw.mapper; import com.gqzzw.domain.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class UserMapperTset { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private UserMapper userMapper; @Before public void init() throws IOException { //读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //使用构建者创建工厂对象SqlSessionFactory factory = builder.build(in); //使用SqlSessionFactory产SqlSession对象生 sqlSession = factory.openSession(); //产SqlSession对象时可以传true代表自动提交事务 //sqlSession = factory.openSession(true); //使用SqlSession创建映射接口的代理对象 userMapper = sqlSession.getMapper(UserMapper.class); } @After public void destroy() throws IOException { //提交事务,释放资源 sqlSession.commit(); sqlSession.close(); in.close(); } @Test //测试二级缓存 public void findById(){ System.out.println(userMapper.findById(41)); //关闭一级缓存 sqlSession.close(); //重新获取sqlSession和Mapper sqlSession = factory.openSession(); userMapper = sqlSession.getMapper(UserMapper.class); //这里日志没有向数据库发送语句,说明二级缓存生效 System.out.println(userMapper.findById(41)); } }
转载请注明:零五宝典 » Mybatis的一级缓存和二级缓存