MyBatis源碼(六)之動態Sql解析運行階段BoundSql

上篇博文講述的是dao方法參數是如何傳遞到Executor的MyBatis源碼(五)之動態Sql解析運行階段參數處理 一定要有這個基礎,在進行本博文你將看到一條Sql是如何拼裝出來的。

Executor的query方法

我把運行時信息打印出來,主要是在順便回顧下之前的講解讀取mapper過程,解析select insert 等標籤的時候有一行代碼是獲取SqlSouce的,解析的時候有一個動態標籤 if foreach where 等,這個sql就是DynamicSqlSouce。

一條Sql根據內部標籤 include where foreach等拆分成不同的sqlNode,圖中DynamicSqlSource中的成員rootSqlNode就是MixedSqlNode包含了所有的SqlNode如右圖的,每個sqlNode都是遞歸的!!!
可以回顧下MyBatis源碼(四)之mapper文件解析和動態Sql解析啓動階段

上面這一張截圖,獲取BoundSql就是本篇的全部,包含sql的最終定義。

public class DynamicContext {

  public static final String PARAMETER_OBJECT_KEY = "_parameter";
  public static final String DATABASE_ID_KEY = "_databaseId";
  private final ContextMap bindings;
  private final StringBuilder sqlBuilder = new StringBuilder();
  private int uniqueNumber = 0;

  public DynamicContext(Configuration configuration, Object parameterObject) {
    if (parameterObject != null && !(parameterObject instanceof Map)) {
      MetaObject metaObject = configuration.newMetaObject(parameterObject);
      bindings = new ContextMap(metaObject);
    } else {
      bindings = new ContextMap(null);
    }
    bindings.put(PARAMETER_OBJECT_KEY, parameterObject);
    bindings.put(DATABASE_ID_KEY, configuration.getDatabaseId());
  }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章