MyBatis之一级缓存讲解

本文介绍MyBatis中缓存机制的应用,包括一级缓存如何工作及其带来的性能提升。通过示例展示了相同数据查询时缓存的使用,以及不同数据查询时缓存的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、缓存的定义

        在计算机中为了匹配各种存储设备之间速度的不平衡,特设立缓存减少数据检索的时间(比如cpu的cache),在数据库中亦是如此,如果每次查询数据都直接从数据库中检索必定会浪费大量的时间。为此MyBatis将常用数据放入SqlSession的缓存中,这样在检索数据的过程中就先在缓存中查找如果缓存中不存在才会去数据库中查找,并将查找的数据放入SqlSession缓存中方便下次检索。大大减少了检索的时间开销


二、一级缓存注意事项    

        MyBatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中两次执行相同的Sql语句,第一次执行完毕会将数据库中的查询的数据写到缓存中(内存)中,第二次会从缓存中获取数据将不再从数据库查找,从而提高查询效率,当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。MyBatis默认开启一级缓存。

三、代码及实验结果展示

           1、两次查询相同的数据

        SqlSessionFactory sqlSessionFactory = GetSessionFactroy();
		SqlSession openSession = sqlSessionFactory.openSession();
		
		OrdersMapperUser mapper = openSession.getMapper(OrdersMapperUser.class);
		
		MyUser user = mapper.findUserByid(1101);
		System.out.println(user.getUsername()+"\t"+user.getPassword());
		
		MyUser user2 = mapper.findUserByid(1101);
		System.out.println(user2.getUsername()+"\t"+user.getPassword());


                运行结果:

               

                我们对数据库进行两次查询,却看到程序只向数据库发送了一条查询语句,这是因为第二次查询时我们已经在缓存中查询到数据,无需再访问数据库进行查询


            2、两次查询不同数据

                SqlSessionFactory sqlSessionFactory = GetSessionFactroy();
		SqlSession openSession = sqlSessionFactory.openSession();
		
		OrdersMapperUser mapper = openSession.getMapper(OrdersMapperUser.class);
		
		MyUser user = mapper.findUserByid(1101);
		System.out.println(user.getUsername()+"\t"+user.getPassword());
		
		MyUser user2 = mapper.findUserByid(1102);
		System.out.println(user2.getUsername()+"\t"+user.getPassword());

            运行结果展示:

                  

                 在这里我们可以清楚的看到因为数据不在缓存中的缘故,程序向数据库发送了两次查询请求



附:本文皆为作者原创,如若转载请注明出处

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值