#{}实现的是向 prepareStatement 中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。
${}是将参数值不加修饰的拼在sql中,相当中用jdbc的statement拼接sql,使用${}不能防止sql注入,但是有时用${}会非常方便。
使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会根据参数值的类型调用不同的statement设置参数值的方法。
${}不能防止sql注入,对系统安全性有很大的影响,如果使用${}建议传入参数尽量不让用户自动填写,即使要用户填写也要对填写的数据进行校验,保证安全性。另外,当传递单个值时${}中填写的参数名称经过测试填写value不错报。