版权声明:转载请注明原创地址 https://blog.csdn.net/ke369093457/article/details/81946058
mybatis中传递参数一般使用#{},但是当参数是表名时#{}就会报错。这是为啥呢?
这是因为#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
简单来讲:select * from user_#{tableVersion}
会被解析为select * from user_?
而${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
简单来讲:select * from user_#{tableVersion}
会被解析为select * from user_1
综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。
#{}与${}的区别可以简单总结如下:
#{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
${}将传入的参数直接显示生成在sql中,不会添加引号
#{}能够很大程度上防止sql注入,${}无法防止sql注入
${}一般用于传输数据库的表名、字段名等
能用#{}的地方尽量别用${}