关于mybatis的#跟$,求大神。。。

#引入的是字符串,如果传入排序字段的话 应该用$
.但是 为什么我看到公司的项目缺用#,如图图片说明

图片说明

并不是你说的“#引入的是字符串,如果传入排序字段的话 应该用$”,而是:#和$都可以作为参数传递字符串,但是#可以防止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 , 后边必须写${}

是占位符参数,类似 preparedstatement。

$ 是直接传递拼接参数。

简单理解:
(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})