介绍
从传统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进行按部拆解后,对源码的设计和采用的一些设计模式有了一定程度的掌握。这些思路可以很好的辅佐我们日常进行需求开发。
其中装饰器模式、代理模式、工厂模式尤为重要。