首頁 > 軟體

mybatis原始碼解讀之executor包語句處理功能

2022-02-15 19:00:10

1.mybatis對多語句型別的支援

mybatis對映檔案中傳引數,主要用到#{} 或者 ${}.

#{}:表示使用這種符號的變數會以預編譯的形式賦值到sql片段中。

${}:表示使用這種符號的變數會以字串的形式直接插到sql片段中。

mybatis中支援三種語句型別,不同語句型別支援的變數符號不同。mybatis的三種型別如下:

  • STATEMENT:這種語句型別中,只會對sql片段進行簡單的字串拼接。只支援使用${}.
  • PREPARED:這種語句中會先對sql片段進行字串拼接,然後再對sql片段進行賦值。可以使用#{}和${}.
  • CALLABLE:這種語句用了實現執行過程的呼叫,會先對sql片段進行字串拼接,然後對sql片段進行賦值。可以使用#{}和${}.

2.mybatis的語句處理功能

statement子包負責提供語句處理功能,其中StatementHandler是語句功能類的父介面,RoutingStatementHandler類是一個代理類,它能夠根據傳入的MappedStatement物件的具體型別選中一個具體的被代理物件,然後將所有實際操作都委託給被代理物件。所以RoutingStatementHandler類提供的是路由功能,而路由選擇的依據就是語句型別。

public class RoutingStatementHandler implements StatementHandler {

  // 根據語句型別選取出的被代理類的物件
  private final StatementHandler delegate;

  public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    // 根據語句型別選擇被代理物件
    switch (ms.getStatementType()) {
      case STATEMENT:
        delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
        break;
      case PREPARED:
        delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
        break;
      case CALLABLE:
        delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
        break;
      default:
        throw new ExecutorException("Unknown statement type: " + ms.getStatementType());
    }
  }
}

BaseStatementHandler作為三個實現類的父類別,提供了實現類的公共方法。並且BaseStatementHandler類使用的模板模式在prepare方法中定義了整個方法的框架,然後將一些與子類相關的操作交給三個子類處理。

SimpleStatementHandler類、PreparedStatementHandler類和CallableStatementHandler類是三個真正的statement處理器,分別處理statement、preparedStatementCallableStatement物件。通過其中的parameterize方法可以看出三個Statement處理器的不同。

SimpleStatementHandlerparameterize方法的實現為空,因為它只需要完成字串替換即可,不需要進行引數處理

public class SimpleStatementHandler extends BaseStatementHandler {

 @Override
  public void parameterize(Statement statement) {
    // N/A
  }

  }

PreparedStatementHandlerparameterize方法最終通過ParameterHandler介面經過多級中轉後呼叫了PreparedStatement類中的引數賦值方法。

public class PreparedStatementHandler extends BaseStatementHandler {
  @Override
  public void parameterize(Statement statement) throws SQLException {
    parameterHandler.setParameters((PreparedStatement) statement);
  }
}

CallableStatementHandler中parameterize主要是通過registerOutputParameters方法中轉後呼叫CallableStatement中的輸出引數註冊方法完成輸出引數的註冊,然後通過ParameterHandler介面經過多級中轉後呼叫了PreparedStatement類中的引數賦值方法。

public class CallableStatementHandler extends BaseStatementHandler {
 /**
   * 對語句進行引數處理
   * @param statement SQL語句
   * @throws SQLException
   */
  @Override
  public void parameterize(Statement statement) throws SQLException {
    // 輸出引數的註冊
    registerOutputParameters((CallableStatement) statement);
    // 輸入引數的處理
    parameterHandler.setParameters((CallableStatement) statement);
  }

}

到此這篇關於  mybatis原始碼解讀之executor包語句處理功能的文章就介紹到這了,更多相關executor包語句處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com