之前的一篇 Mybatis中 #{}和${}的區別 中涉及到通過 SQL預編譯和 #{} 傳值 的方式防止SQL注入。
由此引發了想了解預編譯的想法。那么什么是預編譯那?
一、三個階段:
-
詞法和語義解析
-
優化sql語句,制定執行計划
-
執行並返回結果
二、預編譯出現的原因
1、很多情況下,一條SQL語句可能會反復執行,或者每次執行的時候只有個別的值不同
2、比如query的where條件的值不同,update的set的值不同,insert的values值不同,都會造成SQL語句的不同。
3、每次因為這些值的不同就進行詞法語義解析、優化、制定執行計划,就會很影響效率。
4、而且往往 步驟 1、2 加起來的時間比 步驟 3的時間還要長。
這種情況下就需要預編譯的出場了。
三、預編譯
1、預編譯:指的是數據庫驅動在發送 sql 語句和參數給 DBMS 之前對 sql 語句進行編譯,這樣 DBMS 執行 sql 時,就不需要重新編譯。
2、預編譯的好處:
1、預編譯之后的 SQL 多數情況下可以直接執行,DBMS 不需要再次編譯。
2、越復雜的SQL,編譯的復雜度將越大,預編譯階段可以合並多次操作為一個操作。
3、相同的預編譯 SQL 可以重復利用。(把一個 SQL 預編譯后產生的 PreparedStatement 對象緩存下來,
下次對於同一個 SQL,可以直接使用這個緩存的 PreparedState 對象。)
4、可以將這類SQL語句中的值用占位符替代,不需要每次編譯,可以直接執行,
只需執行的時候,直接將每次請求的不同的值設置到占位符的位置。
5、預編譯可以視為將sql語句模板化或者說參數化。
四、mybatis之sql動態解析以及預編譯源碼
mybatis sql 動態解析
mybatis 在調用 connection 進行 sql 預編譯之前,會對sql語句進行動態解析,動態解析主要包含如下的功能:
-
-
占位符的處理
-
動態sql的處理
-
參數類型校驗
-
注: mybatis 默認情況下,將對所有的 sql 進行預編譯。
參照:https://www.cnblogs.com/ConfidentLiu/p/7142495.html
參照:https://www.jianshu.com/p/9972d7b33061
待續。。。。