初步认识MyBatis核心组件

前言

关于MyBatis的核心组件有多很多,本文仅针对SQL执行过程中,所涉及核心组件,结合源码地图进行解析。目的是让你能在短时内对MyBatis源码有一个初步的认识。

JDBC执行流程回顾

MyBatis是一个基于JDBC的数据库访问组件。首先回顾一下JDBC执行流程:!
初步认识MyBatis核心组件

代码示例:

/** 第一步: 获取连接 /
Connection connection = DriverManager
.getConnection(JDBC.URL, JDBC.USERNAME, JDBC.PASSWORD);
/
* 第二步: 预编译SQL /
PreparedStatement statement = connection
.prepareStatement("select * from users ");
/
* 第三步: 执行查询 /
ResultSet resultSet = statement.executeQuery();
/
* 第四步: 读取结果 */
readResultSet(resultSet);
Mybats“修改”地图!初步认识MyBatis核心组件

通过一个"修改"用例来了解一下MyBatis是在哪里调用了上述代码。通过源码地图我们可以快速定位到。其分别对应图中节点:获取连接、构建Statement、设置参数、以及执行修改。等

小贴士:

选中节点按F3可直接查看源码
点右下角按钮可全屏
找到了JDBC调用,并不代表就掌握了MyBatis源码。图中JDBC调用只是很小一部分,更多的节点我们还很陌生,接下来我们就一起来认识一下图中的其它核心节点。分别是:SQL会话、执行器、SQL声明处理器、参数处理器。

会话(SqlSession)

SqlSession 是myBatis的门面(采用门面模式设计),核心作用是为用户提供API。API包括增、删、改、查以及提交、关闭等。其自身是没有能力处理这些请求的,所以内部会包含一个唯一的执行器 Executor,所有请求都会交给执行器来处理。如下图中SqlSession接收用户“修改”请求,然后转交给Executor。
初步认识MyBatis核心组件
执行器(Executor)

Executor是一个大管家,核心功能包括:缓存维护、获取动态SQL、获取连接、以及最终的JDBC调用等。在图中所有蓝色节点全部都是在Executor中完成。初步认识MyBatis核心组件

这么多事情无法全部亲力亲为,就需要把任务分派下去。所以Executor内部还会包含若干个组件:

缓存维护:cache
获取连接:Transaction
获取动态sql:SqlSource
调用jdbc:StatementHandler
上述组件中前三个和Executor是1对1关系,只有StatementHandler是1对多。每执行一次SQL 就会构造一个新的StatementHandler。想必你也能猜出StatementHandler的作用就是专门和JDBC打交道,执行SQL的。

SQL处理器(StatementHandler)

在JDBC中执行一次sql的步骤包括。预编译SQL、设置参数然后执行。StatementHandler就是用来处理这三步。同样它也需要两个助手分别是:

设置参数:ParameterHandler
读取结果:ResultSetHandler
另外的执行是由它自己完成。

总结:

总结一下myBatis的一次“修改”操作主要经过了如下组件:

SqlSession:会话可以理解成你在肯德基用餐过程,你会点很多食物,并交给厨房制作,吃完了,用餐过程就结束了。同样会话会执行多个SQL、并交给Executor处理、所有SQL执行完,会话就结束了需要关闭。
Executor:有点像是肯德基的后厨经理,大小事情都由他来管,并将任务分派给下属执行。Executor 要维护缓存、维护事物连接、执行等,而所有的操作都需要分派给对应的负责人。
StatementHandler:专门和JDBC打交道,功能包括设置参数、执行、并读取结果。每执行一次SQLStatementHandler都会生一个唯的实例。
上述组件整个的协作流程如下图,希望你能有所理解。初步认识MyBatis核心组件

上述组件只是讲了其接口以及作用流程。关于其具体实现,希望你能在源码地图中找到找到。为了帮助大家梳理,下图中标记了主要节点的实现。初步认识MyBatis核心组件
如果实在不懂也没有关系,接下来我还会写一些关于MyBatis源码深入分析的文章,敬请期待。

源码地图
初步认识MyBatis核心组件

小贴士: 选中节点按F2查看节点注释

如果你对MyBatis源码非常感兴趣,也可以加入我们的MyBatis源码小组群。跟着鲁班跟大叔一起死磕MyBatis源码。
初步认识MyBatis核心组件
未经许可,禁止转载。