Mybatis(六)引數處理

2021-09-17 00:03:42 字數 866 閱讀 3045

在下面的語句中,如果 username 的值為 zhangsan,則兩種方式無任何區別:

select * from user where name = #;

select * from user where name = $;

其解析之後的結果均為

select * from user where name = 『zhangsan』;

但是 #{} 和 ${} 在預編譯中的處理是不一樣的。#{} 在預處理時,會把引數部分用乙個佔位符 ? 代替,變成如下的 sql 語句:

select * from user where name = ?;

而 ${} 則只是簡單的字串替換,在動態解析階段,該 sql 語句會被解析成

select * from user where name = 『zhangsan』;

以上,#{} 的引數替換是發生在 dbms 中,而 ${} 則發生在動態解析過程中。

那麼,在使用過程中我們應該使用哪種方式呢?

答案是,優先使用 #{}。因為 ${} 會導致 sql 注入的問題。看下面的例子:

select * from $ where name = #

在這個例子中,如果表名為

user; delete user; –

則動態解析之後 sql 如下:

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

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

但是表名用引數傳遞進來的時候,只能使用 ${} ,具體原因可以自己做個猜測,去驗證。這也提醒我們在這種用法中要小心sql注入的問題。**

MyBatis引數處理

1 單個引數 mybatis不做任何特殊處理 2 多個引數 mybatis會做特殊處理 多個引數會被封裝成乙個map,key param1 paramn 或者引數索引 0,1.也可以 3 命名引數 明確指定封裝引數時map的key param 4 封裝成pojo 5 直接傳map集合 6 如果是co...

MyBatis 引數處理

取出引數值。封裝成 乙個map,key param1.paramn,或者引數的索引也可以 value 傳入的引數值 就是從map中獲取指定的key的值 封裝在map中。key collection collection list list 陣列 array value 傳入的引數值 public e...

Mybatis(3) 引數處理

單個引數 mybatis不會做特殊處理,取出引數值。多個引數 mybatis會做特殊處理。多個引數會被封裝成 乙個map,key param1.paramn,或者引數的索引也可以 value 傳入的引數值 就是從map中獲取指定的key的值 命名引數 明確指定封裝引數時map的key param i...