當我們在應用變數的時候預設使用#{},如下:
select * from user where id = #;
select * from user where id = $;
通過上面的例子好像並沒有看出他們之間有什麼區別
新增日誌依賴:
org.slf4j
slf4j-api
1.7.5
org.slf4j
slf4j-log4j12
1.7.5
在resources目錄下,新增log4j.properties
log4j.rootlogger=debug,stdout
log4j.logger.org.mybatis=debug
先看通過${}執行的日誌:
從上面的日誌中可以看出,${}是乙個純粹的string 替換,在動態sql解析階段會進行變數替換
sql直接拼接就好了,parameters為空
看#{}執行的日誌
解析為乙個jdbc的預編譯語句的引數標記符
#{}是佔位符的方式來解決引數傳遞問題,變數的替換是在dbms中,而且替換會自動加單引號 『』
${}是引數拼接的問題,變數的替換是在動態sql解析階段,但是引數拼接可能會存在sql注入的
1.能用#{}的地方就用#{},因為${}存在sql注入非常的不安全,可能一條查詢語句就能變成刪表操作
例如:
select * from $ where name=#2.表明作為變數的時候,必須使用${}知道為什麼嗎?這是由於如果我們使用#{}佔位符傳遞的話會自動加上單引號『』,但是${}不會自動加單引號這個時候我們傳遞tablename 為 user;delete user; --
sql預編譯之後變成:
select * from user; delete user; -- where name = ?;
select * from # where name = #;
預編譯之後變成
select * from ? where name = ?;
假設我們傳入的tablename=user name="zhangsan"
select * from 'user' where name='zhangsan';
上述sql語句是錯誤的,表名不能加單引號
在上面的介紹中提到了很多次的sql預編譯,sql預編譯就是在資料庫驅動在傳送sql語句和引數給dbms之前對sql語句進行編譯,這樣dbms在執行sql語句就不需要重新編譯
Mybatis中 和 有什麼區別
一般說來,二者的區別可總結為以下6點 1 將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。如 order by user id 如果傳入的值是111,那麼解析成sql時的值為order by 111 如果傳入的值是id,則解析成的sql為order by id 2 將傳入的資料直接顯示生...
mybatis中 跟 有什麼區別
動態 sql 是 mybatis 的強大特性之一,mybatis 在對 sql 語句預編譯前,會對 sql 進行動態解析,解析為乙個 boundsql 物件,在動態 sql 解析階段,和 的不同 可以防止sql注入.先把sql中使用 的地方變成?佔位符,再設定引數值 insert into stud...
MyBatis中 與 有什麼區別
1 是預編譯處理,mybatis在處理 時,它會將sql中的 替換為?然後呼叫preparedstatement的set方法來賦值 2 是 字元 串替換,myba tis在 處理 是字串替換,mybatis在處理 是字串替換 myb atis 在處理時,它會將sql中的 替換為變數的值。注意 使用 ...