MyBatis一级二级缓存以及执行sql语句的过程

一、MySQL缓存

  • 一级缓存一次访问数据库的请求会建立一个sqlSession,这个sqlSession会有多条sql语句,MyBatis会将执行过后的数据放到一级缓存,如果该sqlSession执行范围内,前后出现了相同的sql语句,后面的可以直接从缓存拿到数据。

注意:同一个事务中的sql语句属于同一个sqlSession,当期间执行了数据库的update操作后,之前的一级缓存会被清空。

  • 二级缓存一次数据库访问请求结束后sqlSession不会被清理,每个nameSpace下都会保留有一份sqlSession缓存,后端多次访问数据库时可以共用这些session缓存( 多个事务可以共享同一份缓存,但是每个事务执行期间更新了数据库也会刷新缓存

二、MyBatis执行sql语句全过程

结合下图
请添加图片描述

MyBatis执行sql语句的过程中处处体现着动态代理的思想

  1. 首先后端程序调用service接口方法;
  2. service接口被 动态代理拦截指向serviceMapper的xml文件;
  3. mapperProxy代理会执行它的invoke方法调用sqlSession的Executor;
  4. Executor分为两种情况: 第一种情况:未被代理时先执行cacheExecutor,如果是update操作直接更新数据库,如果是查询操作会先 查询缓存(一级二级缓存)命中缓存直接返回,未命中则被代理statementHandler拦截执行preparedStatementHandler方法;
    第二种情况就是Executor直接被代理statementHandler拦截;
  5. preparedStatementHandler在执行查询操作前可以被自定义拦截器拦截( MyBatis原生不支持分页查询功能,此处可以代理实现分页查询);
  6. 设置handler的参数;
  7. 执行sql查询语句具体操作,得到数据库返回数据;
  8. ResultSetHandler处理查询到的数据(此处也可以 被代理拦截,写入自定义的服务端数据处理操作);
  9. 返回数据到前端;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值