MySQL中 和 的區別

2021-09-26 03:34:46 字數 1500 閱讀 7555

動態 sql 是 mybatis 的強大特性之一,也是它優於其他 orm 框架的乙個重要原因。mybatis 在對 sql 語句進行預編譯之前,會對 sql 進行動態解析,解析為乙個 boundsql 物件,也是在此處對動態 sql 進行處理的。在動態 sql 解析階段, # 和 $ 會有不同的表現。

#:解析為乙個 jdbc 預編譯語句(prepared statement)的引數標記符。

select * from user where name = #;
動態解析為:

select * from user where name = ?;
乙個 # 被解析為乙個引數佔位符 ? 。

而$ 僅僅為乙個純碎的 string 替換,在動態 sql 解析階段將會進行變數替換。

select * from user where name = $;
當我們傳遞的引數為 "jack" 時,上述 sql 的解析為:

select * from user where name = "jack";
預編譯之前的 sql 語句已經不包含變數了,完全已經是常量資料了。

綜上所得, $ 變數的替換階段是在動態 sql 解析階段,而 #變數的替換是在 dbms 中。

1、能使用 # 的地方就用 #

例如,如下的 sql:

select * from $ where name = #
假如,我們的引數 tablename 為 user; delete user; --,那麼 sql 動態解析階段之後,預編譯之前的 sql 將變為:

select * from user; delete user; -- where name = ?;
-- 之後的語句將作為注釋,不起作用,因此本來的一條查詢語句偷偷的包含了乙個刪除表資料的 sql。

2. 表名作為變數時,必須使用 $

這是因為,表名是字串,使用 sql 佔位符替換字串時會帶上單引號 '',這會導致 sql 語法錯誤,例如:

select * from # where name = #;
預編譯之後的sql 變為:

select * from ? where name = ?;
假設我們傳入的引數為 tablename = "user" , name = "jack",那麼在佔位符進行變數替換後,sql 語句變為:

select * from 'user' where name='jack';
上述 sql 語句是存在語法錯誤的,表名不能加單引號 ''(注意,反引號 ``是可以的)。

1. 定義:

sql 預編譯指的是資料庫驅動在傳送 sql 語句和引數給 dbms 之前對 sql 語句進行編譯,這樣 dbms 執行 sql 時,就不需要重新編譯。

2. 為什麼需要預編譯

MySQL中 和 的區別

和 的區別是什麼?mybatis在處理 時,會將sql中的 替換為?號,呼叫preparedstatement的set方法來賦值 mybatis在處理 時,就是把 替換成變數的值。使用 可以有效的防止sql注入,提高系統安全性。對於這個題目我感覺要抓住兩點 1 符號一般用來當作佔位符,常使用linu...

Java中 和 的區別

第十一,short s1 1 s1 s1 1 有什麼錯?short s1 1 s1 1 有什麼錯?引出一下討論。賦值運算子,在編譯器將右邊的表示式結果計算出來後,和左邊的變數型別比較精度,如果左邊的變數精度低於右邊的結果的精度,編譯器會顯式的報錯,告訴程式設計師去強制轉型。所以s1 s1 1出錯 最...

Linux shell中 和 的區別

shell中和的區別 結構比結構更加通用。這是乙個擴充套件的test命令,支援萬用字元。在 和 之間所有的字元都不會發生檔名擴充套件或者單詞分割,但是會發生引數擴充套件和命令替換。使用 條件判斷結構,而不是 能夠防止指令碼中的許多邏輯錯誤,比如,和 這些操作符能夠正常存在於這個條件判斷中,但是如果出...