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的一级缓存和二级缓存