一级缓存
首先准备dao和测试类
@Select("select * from user where id = #{id}")
User1 selectByID(Integer id);
@Test
public void testFirstLevelCache(){
User1 user1 = userDao1.selectByID(57);
User1 user2 = userDao1.selectByID(57);
System.out.println(user1==user2);
sqlSession.close();
}
运行结果:
清空缓存
@Test
public void testFirstLevelCache(){
User1 user1 = userDao1.selectByID(57);
sqlSession.clearCache();
User1 user2 = userDao1.selectByID(57);
System.out.println(user1==user2);
}
运行结果:
我们发现一级缓存与使用xml或使用注解的方式一点关系都没有
二级缓存
首先在主配值文件中添加这段话来开启二级缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
编写dao
/**
* 使用二级缓存
*/
@CacheNamespace(blocking = true)
public interface UserDaoWithCache {
@Select("select * from user where id = #{id}")
User1 selectByID(Integer id);
}
在最上方使用@CacheNamespace将block设置为true
代表当前dao使用二级缓存
编写测试类
import com.tubai.dao.UserDaoWithCache;
import com.tubai.domain.User1;
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.InputStream;
public class SecondLevelCacheTest {
private InputStream is;
private SqlSession sqlSession;
private UserDaoWithCache userDao;
private SqlSessionFactory factory;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
}
@After//用于在测试方法运行之后执行
public void close()throws Exception{
is.close();
}
/**
* 测试二级缓存
*/
@Test
public void testSecondLevelCache(){
SqlSession sqlSession1 = factory.openSession();
userDao = sqlSession1.getMapper(UserDaoWithCache.class);
User1 user1 = userDao.selectByID(41);
sqlSession1.close();
SqlSession sqlSession2 = factory.openSession();
userDao = sqlSession2.getMapper(UserDaoWithCache.class);
User1 user2 = userDao.selectByID(41);
sqlSession2.close();
System.out.println(user1==user2);
}
}
运行结果
和之前使用xml的结果是一样的
我们可以从运行结果得知 使用了二级缓存