Unknown column ‘暖‘ in ‘where clause‘

        今天又是记录bug的一天。话不多说,直接粘贴bug。
        “Unknown column ‘暖’ in ‘where clause’”
        梦梦忘记截图了,就复制了bug主要部分,主要是记录一下当时解决的过程。
        还是以前的解决思路,先试着用中文理解bug,“暖”这一列在where子句中没有被发现。翻译出来之后就会感到疑惑,“暖”明明是我传入的值,为什么会是column (列)呢,查看了一下sql,才会发现,把#{} 误写成了 $ {} 这时才恍然大悟,${}是把传入的值原封不动的注入进去了,#{}是防止sql注入,传入的值会加双引号,拼接sql。

        今天顺便就简单总结一下#{} 和 ${}区别吧。
        1,#{}, MyBatis会产生PreparedStatement语句中,会形成 “?”占位符,对接收的参数自动转换为字符串,即会对传入的参数自动加双引号。
                例如:select * from user where name = #{name};
                参数:name : mengmeng
                执行: select * from user where name = “mengmeng”;
        2, ${} ,会把传入的数据直接显示在sql中。也就说对传入的值没有进行加工,不会转化为字符串。
                例如:select * from user where name = #{name};
                参数:name : mengmeng
                执行: select * from user where name = mengmeng;
        所以梦梦错把#{}写成 $ {}才会报上面的bug吧。由此可以看到,#{}安全性相对来说,还是比较高的。但是有些情况下,还是需要 $ {} ,因为sql中需要获取表中的字段名。
        比如:select * from user order by ${age}
        但是大多数情况下,还是使用#{}的。

猜你喜欢

转载自blog.csdn.net/qq_46540738/article/details/123194443