java 查询缓存_Java中MyBatis的查询和缓存

本文详细介绍了MyBatis的一级和二级查询缓存机制,一级缓存基于SqlSession,二级缓存则根据mapper的namespace划分。一级缓存默认开启,增删改操作会清空缓存。二级缓存需实体类实现Serializable接口,增删改操作会清空缓存。此外,文章还讨论了如何关闭缓存和使用第三方缓存如ehcache。
摘要由CSDN通过智能技术生成

查询缓存的使用,主要是为了提高查询访问速度。这篇文章主要介绍了MyBatis查询缓存,需要的朋友可以参考下

查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度。

MyBatis的查询缓存机制,根据缓存区的作用域(生命周期)可划分为两种:一级缓存与二级缓存

一、一级查询缓存

MyBatis一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession。在同一个Sqlsession中两次执行相同的sql语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,从而提高查询效率。

当一个Sqlsession结束后,该Sqlsession中的一级缓存也就不存在了。MyBatis默认一级缓存是开启状态,且不能关闭。

c60c71644e1f032c97370304671f7a69.png

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缓存中读取的。

b027a1ebcbd5c3aaeea2246c971e13dd.png

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);

}

测试类:

//证明从一级缓存中读取数据的依据:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值