StatementHandler&ParameterHandler
StatementHandler是连接Mybatis和JDBC之间的桥梁
。
在执行SQL之前,StatementHandler
需要创建合适的 Statement 对象,然后通过ParameterHandler
将参数值填充到 Statement 对象中,最后通过 Statement.execute()
执行 SQL。SQL 执行完后,通过ResultSetHandler
处理结果。
//-☆☆- SimpleExecutor
public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
Statement stmt = null;
try {
Configuration configuration = ms.getConfiguration();
//NOTE☆: 创建StatementHandler(创建时会加载配置的拦截器Interceptor)
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
//NOTE☆: 创建Statement(和JDBC开始关联)
stmt = prepareStatement(handler, ms.getStatementLog());
//NOTE☆: 调用StatementHandler来真正地执行SQL命令
return handler.query(stmt, resultHandler);
} finally {
closeStatement(stmt);
}
}
1、 创建RoutingStatementHandler
调用configuration.newStatementHandler
创建StatementHandler,实际创建的是RoutingStatementHandler对象,其作用是根据不同的StatementType来进行路由并创建不同的StatementHandler。(相当于一个装饰器模式或者策略模式),Configuration在创建StatementHandler时直接创建RoutingStatementHandler,在其内部用StatementHandler delegate;
来记录正在的StatementHandler。后续所有关于StatementHandler的操作都会经过RoutingStatementHandler的相应方法来执行。
1.1、interceptorChain.pluginAll(statementHandler)
加入拦截器Interceptor
,会为真正的StatementHandler进行封装,最后返回的是一个代理类(通过工具Plugin.wrap)
见插件Interceptor篇
2、 prepareStatement()
该方法的作用是绑定执行时所需要的实参,即把运行时参数设置到SQL中。
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
Statement stm