Mybatis-好文推荐

系列文章目录

  1. Mybatis-原理
  2. Mybatis-缓存
  3. Mybatis-mapper文件中$与#的区别
  4. Mybatis-和Hibernate对比
  5. Mybatis-collection错误去重问题
  6. Mybatis-好文推荐

0x01 使用

0x02 标签

0x03 基本概念

0x04 缓存

  • Mybatis:缓存的使用及源码分析,核心概念,实验分析

  • 美团-聊聊MyBatis缓存机制

  • MyBatis缓存-简洁明了

  • 阿里-Mybatis缓存揭秘

  • 美团-凯伦说-Mybatis缓存

  • mybatis一级与二级缓存详解-图文并茂

  • Mybatis的一级缓存和二级缓存执行顺序
    说明当二级缓存开启的情况下,即使是一个sqlSession中的缓存,都会先去查一下二级缓存,再返回查一级缓存; 所以说,缓存执行顺序是:二级缓存–>一级缓存–>数据库

  • Mybatis缓存实例分析

  • 二级缓存的开启和使用,以及刷新等

  • 更详细的缓存说明,以及第三方实现二级缓存

  • 图文并茂+特点说明

  • Spring+mybatis
    Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的,这是通过mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。 每次Serivce查询之后都要进行关闭sqlSession,关闭之后数据被清空。所以spring整合之后,如果没有事务,一级缓存是没有意义的。

    如果开启二级缓存,关闭sqlsession后,会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。这样,缓存在sqlsession关闭之后依然存在。

    对于查询多commit少且用户对查询结果实时性要求不高,此时采用mybatis二级缓存技术降低数据库访问量,提高访问速度。但不能滥用二级缓存,二级缓存也有很多弊端,从MyBatis默认二级缓存是关闭的就可以看出来。

    二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到的数据就是错误的。举个简单的例子:

    订单和订单详情,orderMapper、orderDetailMapper。在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,这个时候有人要修改订单的基本信息,那就是在orderMapper的namespace下修改,他是不会影响到orderDetailMapper的缓存的,那么你再次查找订单详情时,拿到的是缓存的数据,这个数据其实已经是过时的。

    根据以上,想要使用二级缓存时需要想好两个问题:

    1. 对该表的操作与查询都在同一个namespace下,其他的namespace如果有操作,就会发生数据的脏读。
    2. 对关联表的查询,关联的所有表的操作都必须在同一个namespace。

0x05 生命周期

0x06 Mybatis和Hibernate对比

0x07 手写Mybatis

0x08 Mybatis-Spring

0x08 源码

相关文章: