從Mybatis中#和$的區別到SQL預編譯


#和$的區別

Mybatis中參數傳遞可以通過#和$設置。它們的區別是什么呢?

 

#

Mybatis在解析SQL語句時,sql語句中的參數會被預編譯為占位符問號?

 

$

Mybatis在解析SQL語句時,SQL語句中的參數會被當做字符串拼接SQL。

 

使用#能夠防止SQL注入攻擊。

 

那么什么是預編譯?

什么是預編譯

通常,一條sql在db接收到最終執行完畢返回需要經歷三個階段:

  1. 詞法和語義解析
  2. 優化sql語句,制定執行計划
  3. 執行並返回結果

但是如果同樣一條SQL,如果只是參數值變了,不需要每次都語法語義解析、優化、制定執行計划,

所以可以將這類SQL語句中的值用占位符替代,不需要每次編譯,可以直接執行

執行的時候,直接將每次請求的不同的值設置到占位符的位置。

 

可以視為將sql語句模板化或者說參數化。

 

如果覺得不好理解,可以看看MySQL的預編譯功能

預編譯的優勢

預編譯可以緩存SQL,重復利用,

可以優化SQL的執行

 

預編譯的缺點(什么場景不適合)

傳入表名等數據庫對象時,無法使用#,因為使用#占位符,會將表名加上引號,無法執行。

其他場景,能使用#占位符就盡量使用

 

參考:

預編譯語句(Prepared Statements)介紹,以MySQL為例

# 與 $ 區別以及 sql 預編譯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM