#{}和${}
#{}
在执行SQL时,会将#{}替换为?,生成预编译SQL,会自动设置参数值
使用时机:参数传递,都是用#{}
${}
拼接SQL,直接将参数拼接在SQL语句中,存在sql注入问题
使用时机:如果对表名,列表进行动态设置时使用。
SQL注入:
是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器攻击的方法。
如:在进行用户登录时
select count(*) from emp where username = ' ' and password = ' ' (未使用预编译SQL)
当用户输入的密码为这种形式时 : ' or 1 = '1
这种情况 select count(*) from emp where username = ' ' and password = ' ' or 1 = '1 '
很明显看出改变了SQL语句,无论用户名和密码对否都可以进行登录
预编译优势:
性能更高
更安全(防止SQL注入)