一个sql 是经过解析器编译并执行,注意这里是一个并字。
${}
select * from account where username = ${username} and password = ${password} limit 10
如果为username 传参数 '1' or 1=1 # password aaa
上述sql语句经过编译并执行就变成了 **参数参与了编译**
select * from account where username = '1' or 1=1 # and password = aaa limit 10
就可以查出所有account信息,这就形成了sql注入
而
#{}
select * from account where username = #{username} and password = #{password} limit 10
mybatis会先进行该语句预编译成
select * from account where username = ? and password = ? limit 10
放入到缓存池中。等到服务器执行execute的时候,传给数据库的 '1' or 1=1 # 参数 并不会被编译,而是找到之前编译好的sql模板,进行传参,执行。也就是说 '1' or 1=1 # 只会被数据库当作参数来处理不会被编译。