91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis的executor包語句處理功能源碼分析

發布時間:2022-02-16 09:30:06 來源:億速云 閱讀:113 作者:iii 欄目:開發技術

這篇“mybatis的executor包語句處理功能源碼分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“mybatis的executor包語句處理功能源碼分析”文章吧。

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包語句處理功能源碼分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三台县| 玉龙| 万宁市| 大石桥市| 十堰市| 运城市| 资溪县| 邵阳市| 美姑县| 汶川县| 钟山县| 德州市| 班玛县| 九龙县| 吉安县| 西乡县| 湖口县| 紫阳县| 淮阳县| 云南省| 漾濞| 开鲁县| 乳山市| 九寨沟县| 固原市| 长兴县| 三明市| 松阳县| 元氏县| 镇宁| 高州市| 胶州市| 宁德市| 天祝| 云龙县| 西乡县| 湖口县| 紫阳县| 湘潭市| 阿荣旗| 鱼台县|