mybatis 和 的區別

2021-09-16 13:26:15 字數 1444 閱讀 2152

1 .#將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號

$將傳入的資料直接顯示生成在sql中

例如:  

(1)order by #user_id#,如果傳入的值是111,那麼解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為                        order by "id".

order by $user_id$,如果傳入的值是111,那麼解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為                            order by id.

(2)  如果傳入的name 是zhangsan

select * from user where name = #;

select * from user where name = $; 

解析結果一樣 為:select * from user where name = 'zhangsan';

2.#{}是預編譯處理,${}是字串替換

例如:(1)select * from user where name = #;

mybatis在處理#{}時,會將sql中的#{}替換為 ? 號,呼叫preparedstatement的set方法來賦值

結果為: select * from user where name= ?

(2) select * from user where name = $;

字串替換 結果為(如果name 是 zhangsan):

select * from user where name = 'zhangsan'

3.優先使用 #{}。因為 ${} 會導致 sql 注入的問題

原因:#{} 採用的是預編譯機制,預編譯完成之後,sql的結構已經固定,即便使用者輸入非法引數,也不會對sql的結構產生 影響,從而避免了潛在的安全風險。

我們知道,sql注入是發生在編譯的過程中,因為惡意注入了某些特殊字元,最後被編譯成了惡意的執行操作 所以 ${}可以出現sql注入問題。

例如:select * from $ where name = #

如果表名  user; delete user; -- 

則動態解析之後 sql 如下:

select * from user; delete user; -- where name = ?;

--之後的語句被注釋掉,而原本查詢使用者的語句變成了查詢所有使用者資訊+刪除使用者表的語句,會對資料庫造成重大損傷,            極大可能導致伺服器宕機。

4.$方式一般用於傳入資料庫物件,例如傳入表名 字段 等

5.mybatis排序時使用order by 動態引數時需要注意,用$而不是#

mybatis 和 的區別

size x large mybatis ibatis中 和 的區別 1.將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。如 order by user id 如果傳入的值是111,那麼解析成sql時的值為order by 111 如果傳入的值是id,則解析成的sql為order by ...

myBatis 和 的區別

輸入引數parametertype 型別為簡單型別 8個基本型別 string 識別符號只能是value 會自動轉換型別 string型別的會 自動加 單引號 適用用於賦值 例子 update students set name stuno where id insert into students...

mybatis 和 的區別

他們之間的區別用最直接的話來說就是 相當於對資料 加上 雙引號,相當於直接顯示資料。1 對傳入的引數視為字串,也就是它會預編譯,select from user where name 比如我傳乙個csdn,那麼傳過來就是 select from user where name csdn 2 將不會將...