今天在处理一个BUG时发现后台报错为sql语句出错,检查后台日志后发现sql语句如下
仔细观察后发现是传入的两个参数没有加上引号导致的,上网查询后发现原因是在mybatis的xml文件中,参数使用的是${}传递。
而使用${}传递的参数是不做处理的,会直接生成sql语句,如
select * from student where name=${soap}
结果会是
select * from student where name=soap
由于sql中soap没有加上引号,所以会导致报错,因此只要将原来的xml文件中传参的方式改为#{}即可。最后总结一下两种传参方式的区别:
其实这两种方式的区别跟以前我们在写JDBC时preparedstatement和statement的区别是差不多的。
大概上可以理解为#{}是preparedstatement,${}是statement。
#{}会当成占位符插入在sql语句,生成的sql语句中参数会带有引号。
而${}则是纯粹的替换掉参数,不会加上引号。
一般情况下我们都是使用#{},因为这样更加安全,能够防止sql注入,而当我们需要用order排序或者要传入的是表名时就只能用${}了。