#和$的區別
Mybatis中參數傳遞可以通過#和$設置。它們的區別是什么呢?
#
Mybatis在解析SQL語句時,sql語句中的參數會被預編譯為占位符問號?
$
Mybatis在解析SQL語句時,SQL語句中的參數會被當做字符串拼接SQL。
使用#能夠防止SQL注入攻擊。
那么什么是預編譯?
什么是預編譯
通常,一條sql在db接收到最終執行完畢返回需要經歷三個階段:
- 詞法和語義解析
- 優化sql語句,制定執行計划
- 執行並返回結果
但是如果同樣一條SQL,如果只是參數值變了,不需要每次都語法語義解析、優化、制定執行計划,
所以可以將這類SQL語句中的值用占位符替代,不需要每次編譯,可以直接執行
執行的時候,直接將每次請求的不同的值設置到占位符的位置。
可以視為將sql語句模板化或者說參數化。
如果覺得不好理解,可以看看MySQL的預編譯功能
預編譯的優勢
預編譯可以緩存SQL,重復利用,
可以優化SQL的執行
預編譯的缺點(什么場景不適合)
傳入表名等數據庫對象時,無法使用#,因為使用#占位符,會將表名加上引號,無法執行。
其他場景,能使用#占位符就盡量使用
參考:
預編譯語句(Prepared Statements)介紹,以MySQL為例