Mybatis中$和#的区别
最近在修改Mybatis里面mapper文件的时候经常会遇到这样一个问题,到底该用$还是用#来传递值呢,现在做个区别。
最明显的区别在于,#传入的时候会为其加上双引号,而$则是原样传值。
这是因为#{}使用的是预编译语句, 采用的是占位符的形式,所以会加上引号,所以其参数默认为字符串,这样可以防止SQL注入。
而${}则是原样传输,原来参数是什么样子就是什么样子。
但是要注意当parameterType为Int的时候,也可以使用#{}。也要注意排序的时候,也就是用Order by的时候要采用$来,因为这样mysql才不会转义字符串。
案例
SELECT
name
FROM t_name
WHERE add = #{add}
这样传值就传入字符串,比如String add='上海',那么其sql语句就是add="上海".
而$就用的就比较少了,一般用在order by和一些特殊情况,如下:
SELECT name FROM t_name
where add LIKE CONCAT('%','${q}','%')
ORDER BY ${sidx} ${sord}
总结
1、#自动加上引号,可以防止SQL注入;$原样传值,无法防止SQL注入
2、常用#来传值;order by、传数据库对象(表名)、like concat常用$