在动态sql解析过程,#{}与${}的效果是不一样的:
要实现动态传入表名、列名,需要做如下修改
添加属性statementType="STATEMENT"
同时sql里的属有变量取值都改成${xxxx},而不是#{xxx}
#{}与${}区别:
#{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
${}将传入的参数直接显示生成在sql中,不会添加引号
#{}能够很大程度上防止sql注入,${}无法防止sql注入
因为${}是将传入的参数直接显示生成sql,如${xxx}传入的参数为字符串数据,需在参数传入前加上引号,如:
String name = "sprite"; name = "'" + name + "'";
#{}解析被解析为一个参数占位符?。
综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。
使用动态传参时可以重新封装一次数据再传入即可
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>
网友评论