mysql中#{}和${}的區(qū)別詳解
#{}
會將傳入的數(shù)據(jù)當成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號
order by #{userId}
這里假如userId = 111,那么解析成sql時會變成 order by "111"
這里如果userId = idStr,那么解析成sql時會變成 order by "idStr"
${}
會將傳入的數(shù)據(jù)直接顯示生成在sql中
order by #{userId}
這里假如userId = 111,那么解析成sql時會變成 order by 111
這里如果userId = idStr,那么解析成sql時會變成 order by idStr
#方式能夠很大程度防止sql注入;$方式無法防止Sql注入。
$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名。
一般能用#
的就別用$
。MyBatis排序時使用order by 動態(tài)參數(shù)時需要注意,用$
而不是#
。
默認情況下,使用#{}格式的語法會導致MyBatis創(chuàng)建預處理語句屬性并以它為背景設置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在SQL語句中插入一個不改變的字符串。比如,像ORDER BY,你可以這樣來使用:
ORDER BY ${columnName}; 這里MyBatis不會修改或轉義字符串。
例子:
在沒有做防Sql注入的時候,我們的Sql語句可能是這么寫的:
<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = '${value}' </select>
但如果我們對傳入的姓名參數(shù)做一些更改,比如改成anything’ OR ‘x’='x,那么拼接而成的Sql就變成了
SELECT id,name,age FROM student WHERE name = 'anything' OR 'x'='x'
庫里面所有的學生信息都被拉了出來,是不是很可怕。原因就是傳入的anything’ OR ‘x’='x和原有的單引號,正好組成了 ‘anything’ OR ‘x’='x’,而OR后面恒等于1,所以等于對這個庫執(zhí)行了查所有的操作。
防范Sql注入的話,就是要把整個anything’ OR ‘x’='x中的單引號作為參數(shù)的一部分,而不是和Sql中的單引號進行拼接
使用了#即可在Mybatis中對參數(shù)進行轉義
<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = #{name} </select>
我們看一下發(fā)送到數(shù)據(jù)庫端的Sql語句長什么樣子。
SELECT id,name,age FROM student WHERE name = 'anything\' OR \'x\'=\'x'
到此這篇關于mysql中#{}和${}的區(qū)別的文章就介紹到這了,更多相關mysql中#{}和${}的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

MySQL SHOW PROCESSLIST協(xié)助故障診斷全過程

MySQL數(shù)據(jù)庫InnoDB數(shù)據(jù)恢復工具的使用小結詳解

Mysql中關于Incorrect string value的解決方案