#
引入的是字符串,如果传入排序字段的话 应该用$
.但是 为什么我看到公司的项目缺用#
,如图
并不是你说的“#引入的是字符串,如果传入排序字段的话 应该用$”,而是:#和$都可以作为参数传递字符串,但是#可以防止SQL注入而$不行;一般来说我们用#作为一般参数的传入,而$则是作为一些特定字符串的传入,这些字符串一般是在后台处理过的,以防止SQL注入。
我们这边统一用#,这两个都代表是接收的数据,区别在于#可以防止别人sql注入 具体的你可以看看https://blog.csdn.net/qq_35978746/article/details/54944644
$ 与 #区别 :
一个 #{ } 被解析为一个参数占位符 ? 。
而${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。#可以防止sql注入
#{} : 可以防止sql注入, sql语句在编译的过程中,会把值转换成?占位符, 在最终编译的时候,会对值进行转义,添加””, 当传入的值为简单数据类型的时候, 括号内部可以随便写 #{}
${} : 不能防止sql注入, 不会对传入的值进行转义的操作, 直接完成sql语句的拼接, 当传入的值为简单数据类型的时候, 括号内部必须写value ${value}
Ps: 当执行排序的sql语句的时候, order by , 后边必须写${}
$ 是直接传递拼接参数。
简单理解:
(1)#{},解析时会在参数前后加上单引号,例如where a = #{b},传入b的值为c,最终会解析为where a = 'c'
(2)${},解析时不会对参数做任何处理,例如where a = #{b},传入b的值为c,最终会解析为where a = c,所以${}存在sql注入的问题,而#{}不会
所以能用#,就不用$,$一般使用情况:模糊查询,动态字段名排序,例如:
1.where columnName like '%${A}%';
2.order by ${columnName};
3.where columnName in (${A})