查询缓存的使用,主要是为了提高查询访问速度。这篇文章主要介绍了MyBatis查询缓存,需要的朋友可以参考下
查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度。
MyBatis的查询缓存机制,根据缓存区的作用域(生命周期)可划分为两种:一级缓存与二级缓存
一、一级查询缓存
MyBatis一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession。在同一个Sqlsession中两次执行相同的sql语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,从而提高查询效率。
当一个Sqlsession结束后,该Sqlsession中的一级缓存也就不存在了。MyBatis默认一级缓存是开启状态,且不能关闭。
1.一级缓存的存在性证明
测试类:
//证明一级缓存的存在
@Test
public void test01(){
//第一次查询
Student student = dao.selectStudentById(2);
System.out.println(student);
//第二次查询
Student student2 = dao.selectStudentById(2);
System.out.println(student2);
}
mapper:
select * from student where id=#{id}
控制台:
执行完后,发现只执行了一次从DB中的查询,第二次的结果是直接输出的。说明,第二次是从Sqlsession缓存中读取的。
2.从缓存读取数据的依据是sql的id
一级缓存缓存的是相同sql映射id的查询结果,而非相同sql语句的查询结果。因为MyBatis内部对于查询缓存,无论是一级查询还是二级查询,其底层均使用一个hashmap实现:key为sql的id相关内容,value为从数据库中查询出的结果。
mapper:
select * from student where id=#{id}
select id,name,age,score,birthday from student where id=#{id}
dao接口:
public interface IStudentDao {
Student selectStudentById(int id);
Student selectStudentById2(int id);
}
测试类:
//证明从一级缓存中读取数据的依据: