以前的一篇 Mybatis中 #{}和${}的區別 中涉及到經過 SQL預編譯和 #{} 傳值 的方式防止SQL注入。html
由此引起了想了解預編譯的想法。那麼什麼是預編譯那?sql
一、不少狀況下,一條SQL語句可能會反覆執行,或者每次執行的時候只有個別的值不一樣
數據庫
二、好比query的where條件的值不一樣,update的set的值不一樣,insert的values值不一樣,都會形成SQL語句的不一樣。緩存
三、每次由於這些值的不一樣就進行詞法語義解析、優化、制定執行計劃,就會很影響效率。mybatis
四、並且每每 步驟 一、2 加起來的時間比 步驟 3的時間還要長。ide
這種狀況下就須要預編譯的出場了。post
一、預編譯:指的是數據庫驅動在發送 sql 語句和參數給 DBMS 以前對 sql 語句進行編譯,這樣 DBMS 執行 sql 時,就不須要從新編譯。優化
二、預編譯的好處:spa
一、預編譯以後的 SQL 多數狀況下能夠直接執行,DBMS 不須要再次編譯。code
二、越複雜的SQL,編譯的複雜度將越大,預編譯階段能夠合併屢次操做爲一個操做。
三、相同的預編譯 SQL 能夠重複利用。(把一個 SQL 預編譯後產生的 PreparedStatement 對象緩存下來,
下次對於同一個 SQL,能夠直接使用這個緩存的 PreparedState 對象。)
四、能夠將這類SQL語句中的值用佔位符替代,不須要每次編譯,能夠直接執行,
只需執行的時候,直接將每次請求的不一樣的值設置到佔位符的位置。
五、預編譯能夠視爲將sql語句模板化或者說參數化。
mybatis 在調用 connection 進行 sql 預編譯以前,會對sql語句進行動態解析,動態解析主要包含以下的功能:
佔位符的處理
動態sql的處理
參數類型校驗
注: mybatis 默認狀況下,將對全部的 sql 進行預編譯。
參照:http://www.javashuo.com/article/p-ccoljqxp-dn.html
參照:https://www.jianshu.com/p/9972d7b33061
待續。。。。