MyBatis源码解析

1.ExecutorExecutor 是 MyBatis 的核心接口之一 , 其中定义了数据库操作的基本方法 。在实际应用中经常涉及的 SqISession 接口的功能 , 都是基于 Executor 接口实现的 。
 

MyBatis源码解析

文章插图
 
BaseExecutor 是一个实现了 Executor 接口的抽象类 , 它实现了 Executor 接口的大部分方法 。BaseExecutor 中主要提供了缓存管理和事务管理的基本功能 , 继承 BaseExecutor 的子类只要实现四个基本方法来完成数据库的相关操作即可 , 这四个方法分别是:doUpdate()方法、doQuery()方法、doQueryCursor()方法、doFlushStatement()方法 。
// 一级缓存 , 用于缓存该Executor对象查询结果集映射得到的结果对象protected PerpetualCache localCache;// 一级缓存 , 用于缓存输出类型的参数protected PerpetualCache localOutputParameterCache;常见的应用系统中 , 数据库是比较珍贵的资源 , 很容易成为整个系统的瓶颈 。在设计和维护系统时 , 会进行多方面的权衡 , 并且利用多种优化手段 , 减少对数据库的直接访问 。
使用缓存是一种比较有效的优化手段 , 使用缓存可以减少应用系统与数据库的网络交互、减少数据库访问次数、降低数据库的负担、降低重复创建和销毁对象等一系列开销 , 从而提高整个系统的性能 。
MyBatis 提供的缓存功能 , 分别为一级缓存和二级缓存 。BaseExecutor 主要实现了一级缓存的相关内容 。一级缓存是会话级缓存 , 在 MyBatis 中每创建一个 SqlSession 对象 , 就表示开启一次数据库会话 。在一次会话中 , 应用程序可能会在短时间内(一个事务内) , 反复执行完全相同的查询语句 , 如果不对数据进行缓存 , 那么每一次查询都会执行一次数据库查询操作 , 而多次完全相同的、时间间隔较短的查询语句得到的结果集极有可能完全相同 , 这会造成数据库资源的浪费 。
为了避免上述问题 , MyBatis 会在 Executor 对象中建立一个简单的一级缓存 , 将每次查询的结果集缓存起来 。在执行查询操作时 , 会先查询一级缓存 , 如果存在完全一样的查询情况 , 则直接从一级缓存中取出相应的结果对象并返回给用户 , 减少数据库访问次数 , 从而减小了数据库的压力 。
一级缓存的生命周期与 SqlSession 相同 , 其实也就与 SqISession 中封装的 Executor 对象的生命周期相同 。当调用 Executor 对象的 close()方法时(断开连接) , 该 Executor 对象对应的一级缓存就会被废弃掉 。一级缓存中对象的存活时间受很多方面的影响 , 例如 , 在调用 Executor 的 update()方法时 , 也会先请空一级缓存 。一级缓存默认是开启的 , 一般情况下 , 不需要用户进行特殊配置 。
CachingExecutor 中为 Executor 对象增加了二级缓存相关功能 , 而 mybatis 的二级缓存在实际使用中往往利大于弊 , 被 redis 等产品所替代
二级缓存是mApper级别的缓存 , 多个SqlSession去操作同一个Mapper的sql语句 , 多个SqlSession去操作数据库得到数据会存在二级缓存区域 , 多个SqlSession可以共用二级缓存 , 二级缓存是跨SqlSession的 。
二级缓存是多个SqlSession共享的 , 其作用域是mapper的同一个namespace , 第一次执行完毕会将数据库中查询的数据写到缓存(内存) , 第二次会从缓存中获取数据将不再从数据库查询 , 从而提高查询效率 。
Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存 。
如果缓存中有数据就不用从数据库中获取 , 大大提高系统性能 。
2.StatmentHandlerStatementHandler 接口是 MyBatis 的核心接口之一 , 它完成了 MyBatis 中最核心的工作 , 也是 Executor 接口实现的基础 。
StatementHandler 接口中的功能很多 , 例如创建 Statement 对象 , 为 SQL 语句绑定实参 , 执行 select、insert、update、delete 等多种类型的 SQL 语句 , 批量执行 SQL 语句 , 将结果集映射成结果对象 。
public enum StatementType {STATEMENT, PREPARED, CALLABLE}
MyBatis源码解析


推荐阅读