Mybatis中$和#取資料的區別
阿新 • • 發佈:2018-12-14
Mybatis配置中,取出map入參的資料一般有兩種方式#{key}和${key},下面是這兩種取值的區別:
以同樣的語句做對比:
<select id="geUserByParam1" resultType="Map" parameterType="Map"> select * from t_user t where t.name=#{name} and t.password=#{password} </select>
<select id="geUserByParam2" resultType="Map" parameterType="Map"> select * from t_user t where t.name=${name} and t.password=${password} </select>
如果傳入的name和password引數分別是:admin和123456。
用#{key}取值後執行的sql是select * from t_user t where t.name='admin' and t.password='123456'
用${key}取值後執行的sql是select * from t_user t where t.name=admin and t.password=123456
很明顯,#{key}取值會自動將值看成是字串型別,並帶上單引號;而${key}取值就是傳的值是啥就是啥。由此可見#{key}取值可以防止sql注入,而${key}取值可能會引起sql注入情況。有的時候用模糊查詢可能會用到${key}取值,比如:
<select id="geUserByParam3" resultType="Map" parameterType="Map"> select * from t_user t where t.name like '%${name}%' </select>
其實這種情況也可以用#{key}來代替的:
<select id="geUserByParam3" resultType="Map" parameterType="Map"> select * from t_user t where t.name like concat('%',#{name},'%') </select>
因此建議儘量在開發中用#{key}取值,這樣確實可以避免一些問題!
注意:本文僅代表個人理解和看法喲!和本人所在公司和團體無任何關係!