上篇博文講述的是dao方法參數是如何傳遞到Executor的MyBatis源碼(五)之動態Sql解析運行階段參數處理 一定要有這個基礎,在進行本博文你將看到一條Sql是如何拼裝出來的。
我把運行時信息打印出來,主要是在順便回顧下之前的講解讀取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());
}
}