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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值