MyBatis原理

MyBatis原理

原理

  • MyBatis启动时,解析mybatis的配置文件,并且从指定路径下解析mapper.xml配置文件
    • 把每条sql语句映射成MappedStatement
  • 然后把MappedStatement存放到Configuration的一个mappedStatements属性中(mappedStatements是一个HashMap),key为namespace + id,value为MappedStatement
  • 当要执行sql语句的时候,从mappedStatements这个map中通过id找到MappedStatement
  • 获取MappedStatement对应sql语句、查询参数
  • 查看一级缓存中有没有数据,有则直接返回
  • 缓存没有数据,则查询数据库
    • 通过调用原生的jdbc方法,执行sql语句,获取到结果,删除旧缓存
  • 把结果放到一级缓存,返回结果

接口方式

思考一个问题,通常的Mapper接口,我们可以不实现方法,却可以使用。这是为什么呢?答案很简单 动态代理

开始之前介绍一下MyBatis初始化时对接口的处理:

  • 当判断解析到接口时,会创建此接口对应的MapperProxyFactory对象,存入HashMap中,key = 接口的class对象,value = 此接口对应的MapperProxyFactory对象。
  • 当执行sql的时候,通过MapperProxyFactory生成动态代理实例(JDK动态代理)
  • 通过代理实例,将请求转发给invoker方法
  • 在invoke()方法中,最终SqlSession中的方法执行sql语句

MyBatis缓存

背景

一次数据库会话中,可能会执行的重复的查询语句,极短时间内重复查询,结果往往是一样的,但是造成了数据库资源的浪费。

为了解决这个问题,MyBatis使用了一级缓存。MyBatis在sqlSession对象(表示会话的对象)中建立了一个简单的缓存,将每次查询的结果缓存起来。如果下次有完全一样的查询,直接返回结果。

一级缓存

特点

  • 一级缓存默认是开启的
  • 作用域是session级别,每个sqlSession各自拥有一级缓存,各自隔离。
  • 第一次查询结果换以key value的形式存起来,如果有相同的key进来,直接返回value,这样有助于减轻数据库的压力。
  • 缓存的key格式如下:
    • cache key: id + sql + limit + offset
  • 当commit或者rollback的时候会清除缓存,并且当执行insert、update、delete的时候也会清除缓存。

二级缓存

特点

  • 一个namespace(mapper.xml)就会有一个缓存
  • 不同的sqlSession之间的二级缓存是共享的
  • 实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的,也就是要求实现Serializable接口
    • 因为二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样
    • 如果存储在内存中的话,实测不序列化也可以的。
  • 一般为了避免出现脏数据,所以我们可以在每一次的insert | update | delete操作后都进行缓存刷新

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 缓存和DB中数据一致性

    但是缓存淘汰了以后,主库还没有同步到从库,又有一个读请求,把旧的数据读到缓存,也会造成不一致。

    用户5325874
  • Zookeeper——谈谈ZAB协议

    ZAB(原子消息广播协议)。在Zookeeper中,主要依赖ZAB协议来实现分布式数据一致性。

    用户5325874
  • RocketMQ分析——高并发读写

    生产者发送消息有负载均衡。生产者发送消息时,会自动轮询当前所有可发送的broker,一条消息发送成功,下次换另外一个broker发送,以达到消息平均落到所有的b...

    用户5325874
  • Hibernate缓存小结

    Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对...

    ydymz
  • 缓存的Cache Aside模式

    codecraft
  • Guava CacheBuilder使用说明 原

    CacheBuilder是Guava用于创建LoadingCache、Cache实例的构建类。可以使用下面的方法来创建一个Cache实例。

    随风溜达的向日葵
  • 缓存穿透,缓存击穿,缓存雪崩的内容和解决方案

    每次想到缓存的概念时就会想到下面这张结构图,缓存主要解决的是中央处理器与内存之间速度不匹配出来的问题。

    后端Coder
  • 深入浅出mybatis之缓存机制

    提到缓存,我们都会不约而同地认识到这是提高系统性能的必要措施之一,特别是高命中率的缓存设置,将会大大提高系统的整体吞吐量。缓存的应用场景从小到在http会话中缓...

    2Simple
  • Guava 源码分析(Cache 原理)

    我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

    爱撸猫的杰
  • Google 出的 Guava 是个什么鬼?

    我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

    纯洁的微笑

扫码关注云+社区

领取腾讯云代金券