在動態(tài)sql解析過程瘫寝,#{}與${}的效果是不一樣的:
要實(shí)現(xiàn)動態(tài)傳入表名蜒蕾、列名,需要做如下修改
添加屬性statementType="STATEMENT"
同時sql里的屬有變量取值都改成${xxxx}矢沿,而不是#{xxx}
#{}與${}區(qū)別:
#{}將傳入的參數(shù)當(dāng)成一個字符串滥搭,會給傳入的參數(shù)加一個雙引號
${}將傳入的參數(shù)直接顯示生成在sql中,不會添加引號
#{}能夠很大程度上防止sql注入捣鲸,${}無法防止sql注入
因?yàn)?{}是將傳入的參數(shù)直接顯示生成sql瑟匆,如${xxx}傳入的參數(shù)為字符串?dāng)?shù)據(jù),需在參數(shù)傳入前加上引號栽惶,如:
? ? ? ? String name = "sprite";? ? ? ? name = "'" + name + "'";
#{}解析被解析為一個參數(shù)占位符愁溜?。
綜上所得外厂, ${ } 的變量的替換階段是在動態(tài) SQL 解析階段冕象,而 #{ }的變量的替換是在 DBMS 中。
使用動態(tài)傳參時可以重新封裝一次數(shù)據(jù)再傳入即可
mybatis中的代碼:
<update id="update" statementType="STATEMENT">
update storyuser
set ${field} = ${value} where id = ${id}
</update>
Controller中的代碼
<update id="update" statementType="STATEMENT">
update storyuser
set ${field} = ${value} where id = ${id}
</update>