mybatis中的#和$的区别:
1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username="111", 如果传入的值是id,则解析成的sql为where username="id".
2、$将传入的数据直接显示生成在sql中。
如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;
我们来看以下代码来跑一下:
<select id="test" resultType="java.util.HashMap">
select * from order_info where order_no=${orderNo}
</select>
用Postman做以下测试:

去数据库查一下:
你会发现sql已经注入成功了。
我们把$改成#试一下:
<select id="test" resultType="java.util.HashMap">
select * from order_info where order_no=#{orderNo}
</select>
同样用Postman测试一下,结果如下:

你会发现并未注入成功!
有些同学可能会问,我测试了并不是这样,那你得去看一下你的配置文件了:
server:
port: 9003
spring:
application:
name: xxx-admin
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://88.188.88.98:5706/xxx?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowMultiQueries=true
username: xxxx
password: xxxxx
initialSize: 0
maxActive: 20
maxIdle: 20
minIdle: 1
maxWait: 60000
allowMultiQueries=true //允许批量更新
这个配置是否加上,如果没有的话加上测试一下。

本文详细解析了MyBatis框架中#和$符号在SQL语句中的使用区别,#将传入的数据视为字符串并自动加引号,而$则直接将数据插入SQL中,可能导致SQL注入风险。
461

被折叠的 条评论
为什么被折叠?



