在mybatis中#和$的主要区别是:
#传入的参数在SQL中显示为字符串,能够很大程度防止sql注入;
$传入的参数在SqL中直接显示为传入的值,无法防止Sql注入。
例如:
使用#{}:
select * from student where id = #{id}
当我们传递的参数id为 “1” 时,上述 sql 的解析为:
select * from student where id = "1"
使用${}:
select * from student where id = ${id}
当我们传递的参数id为 “1” 时,上述 sql 的解析为:
select * from student where id = 1
如果我们要做排序的话,使用#{}传入排序类型:asc、desc,就会出现一下问题:
ORDER BY time #{orderType}
以上的orderType传入参数如果为:asc或者desc,那么sql解析结果为:
ORDER BY time "asc" 或者 ORDER BY time "desc"
因为排序默认asc排序,所以相当于如下:
ORDER BY time "asc" asc 或者 ORDER BY time "desc" asc
所以就算传入desc也是无效的,传入的参数变成了time的别名
使用${}传入排序类型:asc、desc,那就不一样了,如下:
ORDER BY time ${orderType}
以上的orderType传入参数如果为:asc或者desc,那么sql解析结果为:
ORDER BY time asc 或者 ORDER BY time desc
这样就能正确的做排序了,但是这样存在sql注入的风险;
传入的参数直接拼接在sql上,就会当作sql脚本运行;
所以尽量使用#{}传参;
如果实在需要用到${}传参的话,代码编写中就需要注意避免sql注入;
#方式能够很大程度防止sql注入。
$方式无法防止Sql注入。
KaTeX parse error: Expected 'EOF', got '#' at position 27: …对象,例如传入表名等 一般能用#̲的就别用
mybatis中还有<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程,或者大于号,小于号等,如:
<![CDATA[
>=
]]>