如前文所诉,statementhandler是具体操作jdbc statement执行数据库sql的类
StatementHandler的初始化
- 跟随Executor,在Executor需要执行数据库操作时新建
- 依赖-Executor,MappedStatement, ResultHandler
- StatementHandler的创建过程如下
//Executor执行数据库操作的方法中创建handler StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null);
//交给RoutingStatmentHandler创建合适的Handler public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) { StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler); statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler); return statementHandler; }
最终根据Mapper中配置的statementType创建出Simple,Prepared,callable中的一种
public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) { switch (ms.getStatementType()) { case STATEMENT: delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler); break; case PREPARED: delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler); break; case CALLABLE: delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler); break; default: throw new ExecutorException("Unknown statement type: " + ms.getStatementType()); } }
各种StatmentHandler的分析
- SimpleStatementHandler-简单的jdbc执行操作封装
- PreparedStatementHandler-preparestatement操作封装
- CallableStatementHandler-CallableStatement操作封装
http://blue2048.iteye.com/admin/blogs/2174274
在Statement中初始化的,还有一些处理输入输出的类对象
- typeHandlerRegistry
- parameterHandler
- resultSetHandler