开启mybatis全局二级缓存的支持,向SqlMapConfig.xml文件添加配置
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
开启mapper的二级缓存的支持,在IUserDao.xml文件中添加配置
<!--开启此mapper的二级缓存的支持-->
<cache/>
在IUserDao.xml文件配置statement上面的useCache属性
<select id="findById" parameterType="int" resultType="user" useCache="true">
select * from user where id=#{id}
</select>
新建测试类SecondLevelCacheTest测试二级缓存
package com.cncs.test;
import com.cncs.dao.IUserDao;
import com.cncs.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;
public class SecondLevelCacheTest {
private InputStream in;
private SqlSession sqlSession;
private SqlSessionFactoryBuilder builder;
private SqlSessionFactory sessionFactory;
private IUserDao userDao;
@Before //在测试方法之前执行
public void init() throws IOException {
//1.读取mybatis核心配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建工厂对象
builder = new SqlSessionFactoryBuilder();
sessionFactory = builder.build(in);
//3.通过工厂对象构建SqlSession对象
sqlSession = sessionFactory.openSession(true);
//4.通过SqlSession对象创建代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After //在测试方法之后执行
public void destory() throws IOException {
//6.释放资源
sqlSession.close();
in.close();
}
@Test
public void testLevelOneCache() throws IOException {
User user1 = userDao.findById(41);
System.out.println(user1);
sqlSession.close();
sqlSession = sessionFactory.openSession(true);
//sqlSession.clearCache();
userDao = sqlSession.getMapper(IUserDao.class);
//user1.setUsername("the loneliest");
//
//userDao.updateUser(user1);
User user2 = userDao.findById(41);
System.out.println(user2);
System.out.println(user1 == user2);
}
}
分析测试结果
在测试方法单元中关闭了SqlSession对象,重新获取了SqlSession对象,说明第二次查询的数据不可能来自一级缓存,只能来自二级缓存。
PS:使用MyBatis的二级缓存必须让相关类实现序列化接口