${}相当于直接传值(字符串替换),#{}相当于替换sql语句中的?
#{}是预编译处理,$ {}是字符串替换。mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。使用 #{} 可以有效的防止SQL注入,提高系统安全性。
综上所述,${}方式会引发SQL注入的问题、同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,能使用#{}
的情况下就不要使用 ${};
那么何时使用${}?
答:在需要插入不会改变的固定字符串时,例如order by${列名}