Mybatis源码分析——sql执行过程的类图

前面分析了sql的执行过程,似乎有点乱,因为没有一个整体的流程图,不知道走到哪是哪。

好吧,我重新画了个图。我们再跟着图来梳理一次吧。如下

Mybatis源码分析——sql执行过程的类图_第1张图片

SqlSession:有3个实现类,分别是DefaultSqlSession、SqlSessionManager、SqlSessionTemplate,后2者其实也是通过代理的方式,最终由DefaultSqlSession实现功能。在DefaultSqlSessionFactory的openSessionFromDataSource方法中返回DefaultSqlSession,同时根据ExecutorType绑定了一个Executor。

在此环节通过statementId获取MappedStatement。

Executor:有2个实现类,BaseExecutor和CachingExecutor。如果开启了缓存,则交给CachingExecutor执行,CachingExecutor使用了模板方法的模式,最终还是交给BaseExecutor的实现类来执行。BaseExecutor有3个实现类,分别是BatchExecutor、ReuseExecutor和SimpleExecutor,由ExecutorType来选择使用哪个。

在此环节将入参封装成BoundSql,如果使用了缓存并且缓存中存在的话,在此层返回数据。

同时获取Connection,并通过StatementType获取对应的StatementHandler来创建Statement。

StatementHandler:有2个实现类,BaseStatementHandler和RoutingStatementHandler,RoutingStatementHandler使用了策略模式,最终还是交给BaseStatementHandler的3个实现类来执行,分别是CallableStatementHandler、PreparedStatementHandler(默认)、SimpleStatementHandler,根据StatementType来选择使用哪个。

此层负责从BoundSql取出sql和入参,使用ParameterHandler绑定参数到Statement,然后调用JDBC接口执行。

ParameterHandler:只有一个实现类,就是DefaultParameterHandler。

负责从BoundSql取出参数绑定到Statement。

ResultSetHandler:只有一个实现类,就是DefaultResultSetHandler。

负责从Statement取出查询结果集ResultSet,通过对应的ResultHandler处理,然后返回。

如果是insert/update/delete操作,就是直接返回int了。

如了,整个流程看起来是不是清晰好多了呢,详细代码,翻上一篇来看吧。


上一篇  Mybatis源码分析——如何执行一条sql

下一篇  Mybatis源码分析——事务

 

你可能感兴趣的:(Mybatis)