当mybatis中需要传入动态的表名或者是字段名时

2018-11-12  本文已影响0人  彭奕茗

在动态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>

上一篇下一篇

猜你喜欢

热点阅读