Mybatis源码解析——StatementHandler
StatementHandler
用于创建statement对象,SQL语句绑定实参,执行SQL语句,调用ResultSetHandler进行结果映射
public interface StatementHandler {
//从连接中获取一个statement
Statement prepare(Connection connection, Integer transactionTimeout)
throws SQLException;
//参数绑定
void parameterize(Statement statement)
throws SQLException;
void batch(Statement statement)
throws SQLException;
int update(Statement statement)
throws SQLException;
<E> List<E> query(Statement statement, ResultHandler resultHandler)
throws SQLException;
<E> Cursor<E> queryCursor(Statement statement)
throws SQLException;
BoundSql getBoundSql();
ParameterHandler getParameterHandler();
}
RoutingStatementHandler
根据mappedStatement中指定的stateType创建对应的statementHandler接口实现类,并设置到自身的delegate字段中,该类的其余所有方法均委托给delegate执行。
比较像根据反射的动态策略模式的方式
BaseStatementHandler
抽象类,只提供一些参数绑定的方法,核心字段为ParameterHandler
ParameterHandler
ParameterHandler处理的是BoundSql中的语句,BoundSql中的Sql会存在?作为占位符
且BoundSql.parameterMappings列表记录了parameterMapping类型的参数属性内容(包括参数名称,对应的javaType,jdbcType,ThpeHandler,resultMapId等内容)。
在DefaultParameterHandler.setParameters()会遍历parameterMappings列表,并根据用户传入的实参与SQL进行绑定,之后交给Statement.execute()交给数据库执行
SimpleStatementHandler
其底层使用Statement,所以SQL语句不能带有?,也就不再需要parameterize()方法来进行参数绑定,该方法为空实现。
在其instantiateStatement()方法通过Connection创建Statement对象,update()将获取BoundSql中的Sql执行并进行KeyGenerator操作将主键添加到用户实参ParameterObject中
PreparedStatementHandler
底层以来PreparedStatement,在其parameterize()方法来进行参数绑定
通过instantiateStatement()方法通过Connection创建PreparedStatement对象
上一篇: MyBatis框架源码解析
下一篇: MyBatis之Transaction