
该系列文章针对 Mybatis 3.5.1 版本
核心处理层完成的工作就是 SQL 的执行,整个操作流程由几个组件类组成,这几个组建类的组合执行逻辑图如下:
图片来自《Mybatis 技术内幕》

如上图,Executor
扮演入口的角色,Executor
主要做了缓存、SQL 执行准备等辅助操作。
真正开始执行 SQL 查询操作,由 StatementHandler
来处理。
StatementHandle
执行操作如下:
构建
Statement
对象通过
ParameterHandler
结合Statement
拼接完整 SQL 语句通过
ResultSetHandler
处理Statement
执行SQL 的结果集,将其映射成对应的 Java 对象
本章主要查看 StatementHandler
相关实现类,不同的 StatementHandler
也意味着构建的 Statement
实现类不同。
一、StatementHandler 相关实现
StatementHandle
实现类类图如下:

如上图所示,StatementHandler
实现类按照功能可以分为两大类
有具体功能实现的类:
BaseStatementHandler
、PreparedStatementHandler
、SimpleStatementHandler
、CallableStatementHandler具有路由功能的类 :
RoutingStatementHandler
RoutingStatementHandler
没有任何具体实现,只有在构造函数时的策略选择,根据用户需要的StatementHandler
类型动态选择相关的StatementHandler
实现类。
1.1、有具体功能实现的实现类
BaseStatementHandler
、PreparedStatementHandler
、SimpleStatementHandler
、CallableStatementHandler
上述几个实现类类图结构,如下图

如图, BaseStatementHandler
是 PreparedStatementHandler
、SimpleStatementHandler
、CallableStatementHandler
的抽象父类。
1.1.1、BaseStatementHandler
BaseStatementHandler
是一个抽象父类,同时也是其子类的抽象模板,BaseStatementHandler
中模板方法为 BaseStatementHandler#prepare
,相关具体代码如下:

如上述代码,BaseStatementHandler#prepare
方法执行的操作分为两步:
1、实例化相关的
Statement
实现(由其子类实现)2、设置Statement相关配信息。
了解了模板方法
StatementHandler#prepare
的执行流程后,需要重点关注的就是其子类关于实例化方法BaseStatementHandler#instantiateStatement
的具体实现。
1.1.1.2、PreparedStatementHandler
、SimpleStatementHandler
、CallableStatementHandler
PreparedStatementHandler
、
SimpleStatementHandler
、
CallableStatementHandler
这三个 StatementHandler
实现类都继承了抽象父类 BaseStatementHandler
。
PreparedStatementHandler
、
SimpleStatementHandler
、
CallableStatementHandler
在实现上大同小异,区别在于其所构建的 Statement
对象不同。
SimpleStatementHandler
通过 Statement
进行 SQL 的处理
PreparedStatementHandler
通过 PreparedStatement
进行 SQL 的处理
CallableStatementHandler
通过 CallableStatement
进行 SQL 的处理。
1.2、RoutingStatementHandler
RoutingStatementHandler 并不构建 Statment
对象执行 SQL 操作。
RoutingStatementHandler
是 StatementHandler
实现类的选择器。
简单来看一下 RoutingStatementHandler
构造函数代码实现,

如上述代码,用户根据需要指定需要使用的 StatementHandler
实现类类型,RoutingStatementHandler
会根据用户选择,动态的选择相关的 StatementHandler
实现类,而不同的实现类意味着不同的 Statement
实现类。
End




