【Mybatis】由浅入深分析源码

介绍

从传统SSM框架到现在SpringCloud框架,Mybatis也成为了一个广为人知的框架。现在估计大多数公司都已经用上了Mybatis-plus吧。

我们在从头学习一下Mybatis的设计思想加深一下记忆。Mybatis是一个优秀的ORM框架,在自由编程sql、简便的集成buff加成下从中脱颖日出。

使用

如何使用现在互联网上到处都有教学贴,自行食用。

框架设计与执行流程

  • Mybatis的核心组件:Sqlsession、MapperPorxy、Executer、Configuration围绕这些进行展开。

那他们之间的关系是怎么样的呢?

从全局到细节的组件流程

从源码给的测试类上可以找出M的加载与执行流程,让我们一起深入了解一下:

加载对数据库访问的Sqlsession对象

操作sqlsession 从而实现访问数据库

Mybatis的缓存设计

一级缓存

在Mybatis访问数据库获取数据时并不是每一次相同的查询都去数据库检索,在默认情况下:开启一级缓存(本地缓存)。

也可以从上面的流程图知晓其在哪里会用到。

一级缓存的特点:在同一个SqlSession内多次调用相同方法时,仅第一次访问数据库,后续都从本地缓存内获取。当该表的的数据在session内发生变化那么会清除本地缓存。

一级缓存的弊端就是不同的session多次读情况下可能会发生脏读现象,当然这个是对于在一级缓存下开启localCacheScop=session。

在localCacheScope=statement时,缓存在每一次执行sql时都会进行重新读。

二级缓存

在有了一级缓存的缺点上针对session间无法共享缓存时,可以通过开启二级缓存来达到目的。

二级缓存的实现方式核心在于Cache接口,在 decorators下可以知道有很多装饰器对Cache接口的不同实现。

二级缓存的作用是可以实现在不同的SqlSession之间共享数据,但在缓存刷新时必须要基于事务提交。

怎么知道Cache在何时加载何时用到?

还记得在流程图哪里有一个叫默认情况下使用的是BaseExecuter吗?在开启二级缓存时,BaseExecuter变更为CacheExecuter。

让我们来一探究竟:

 

所以从源码看的出来加载Executer其实是获取XML配置文件的“defaultExecutorType”来控制的,默认情况是:“SIMPLE ”即 SimpleExecutor。但 CachingExecutor 它是由 cacheEnable的来决定!

那么我们是不是就知道了,只要在XML配置文件里面写 就行了呢? 大家可以尝试一下。

那我们知道它是怎么来的了,我们看看它是如何被使用上的呢?从上面分析的SqlSession操作数据库的流程图来看。如果使用了CachingExecutor那么在调用

 

好的,到此我们已经对Mybatis的缓存机制了解的差不多了。

组件熟悉与理解

为了首尾呼应,我们开头讲了核心组件Sqlsession、MapperProxy、Configuration 、Executer 我们从后向前理解一下。

  • Sqlsession:管理Configuration 、Executer,对外提供可以访问数据库接口,如:select()
  • MapperProxy:管理的是Mapper文件中的Sql语句以及出入参转换。
  • Configuration:管理的加载Mybatis的配置消息
  • Executer:在外部方法调用Sqlsession的select()等方法时,触发Executer。而Executer有很多实现,其中的CacheExecuter又有很多装饰器。

总结

在我们对Mybatis进行按部拆解后,对源码的设计和采用的一些设计模式有了一定程度的掌握。这些思路可以很好的辅佐我们日常进行需求开发。

其中装饰器模式、代理模式、工厂模式尤为重要。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值