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

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

图片说明

6个回答

并不是你说的“#引入的是字符串,如果传入排序字段的话 应该用$”,而是:#和$都可以作为参数传递字符串,但是#可以防止SQL注入而$不行;一般来说我们用#作为一般参数的传入,而$则是作为一些特定字符串的传入,这些字符串一般是在后台处理过的,以防止SQL注入。

我们这边统一用#,这两个都代表是接收的数据,区别在于#可以防止别人sql注入 具体的你可以看看https://blog.csdn.net/qq_35978746/article/details/54944644

crazydddfz
crazydddfz 回复StackTc: 我说的意思就是这样 : 用#{}传入 sql:select * from t_user order by ? ?,这两个问好就是#{}接收的,mysql不认识,用${}传入就是 select * from t_user order by t_id desc
接近 2 年之前 回复
crazydddfz
crazydddfz 回复StackTc: order by 后面是要根据某个字段进行排序,上面已经说了${}仅仅就是传入一个字符串,所以你要看看传入的排序字段和sort 是不是该表的一个字段 ,而sort是不是 “DESC”或者“ASC”,这样数据库直接就解析成根据该字段从大到小排序,而#{}传入的是一个参数占位符,也就是一个‘?’,你觉得你的表里有?这个字段吗
接近 2 年之前 回复
StackTc
StackTc 可是用 #传进去的 不是字符串吗,不是会报错吗
接近 2 年之前 回复

$ 与 #区别 :
一个 #{ } 被解析为一个参数占位符 ? 。
而${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。#可以防止sql注入

weixin_37800734
weixin_37800734 回复StackTc: order by 用${}
接近 2 年之前 回复
StackTc
StackTc select * from abc order by id 'desc'
接近 2 年之前 回复
StackTc
StackTc 比如 select * from abc order by id
接近 2 年之前 回复
StackTc
StackTc 可是用 #传进去的 不是字符串吗,不是会报错吗
接近 2 年之前 回复

#{} : 可以防止sql注入, sql语句在编译的过程中,会把值转换成?占位符, 在最终编译的时候,会对值进行转义,添加””, 当传入的值为简单数据类型的时候, 括号内部可以随便写 #{}

${} : 不能防止sql注入, 不会对传入的值进行转义的操作, 直接完成sql语句的拼接, 当传入的值为简单数据类型的时候, 括号内部必须写value ${value}

Ps: 当执行排序的sql语句的时候, order by , 后边必须写${}

StackTc
StackTc 可是我图片中 为什么那么写 可以?
接近 2 年之前 回复

是占位符参数,类似 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})

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐