#{xxx},使用的是PreparedStatement,会有类型转换,因此比较安全;sql
${xxx},使用字符串拼接,能够SQL注入;安全
like查询不当心会有漏动,正确写法以下:mybatis
Mysql: select * from t_user where name like concat('%', #{name}, '%') spa
Oracle: select * from t_user where name like '%' || #{name} || '%' 日志
SQLServer: select * from t_user where name like '%' + #{name} + '%'orm
关于上述结论能够在xml中验证xml
一、select * from test where id = #{id}对象
随便传个id执行后能够在日志中看到以下结果字符串
select * from test where id = ?编译
原理是采用了jdbc中的PreparedStatement,PreparedStatement是咱们很熟悉的Statement的子类,它的对象包含了编译好的sql语句。这种“准备好”的方式不只能提升安全性,并且在屡次执行一个sql时,可以提升效率,缘由是sql已编译好,再次执行时无需再编译。
二、select * from test order by ${list}
随便传个参数例如id执行后能够在日志中看到以下结果
select * from test order by id
这种是字符串拼接的,存在sql注入隐患
在mybatis中,”${xxx}”这样格式的参数会直接参与sql编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式,因此,这样的参数须要咱们在代码中手工进行处理来防止注入。
因此尽可能用#{}这种方式传参数,若是用到了${}方式要手动过滤sql注入。