欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis源码解析——StatementHandler

程序员文章站 2022-04-21 23:51:58
...

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对象