亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

平乡县| 保德县| 绥棱县| 龙岩市| 龙泉市| 阜城县| 安岳县| 辰溪县| 徐州市| 永福县| 开鲁县| 淄博市| 石渠县| 南陵县| 内黄县| 阳春市| 阿拉善右旗| 榆林市| 林甸县| 菏泽市| 越西县| 驻马店市| 资源县| 弥渡县| 西乡县| 南郑县| 双流县| 望江县| 贵南县| 镇远县| 枣庄市| 祁连县| 汕尾市| 韩城市| 汶上县| 固安县| 邓州市| 锦屏县| 芮城县| 偃师市| 盐源县|