#{ }
表示一个占位符,向占位符输入参数,MyBatis 会自动进行 Java 类型和 jdbc 类型的转换,且不需要考虑参数的类型,以预编译的方式传入,可以有效的防止 SQL 注入,提高系统安全性。例如:传入字符串,MyBatis 最终拼接好的 SQL 就是参数两边加单引号。
${ }
表示 SQL 的拼接,通过 ${ } 接收参数,将参数的内容不加任何修饰拼接在 SQL 中,以字符串替换方式 ${ } 替换成变量的值,可能存在 SQL 注入的安全隐患。在用于传入数据库对象,例如传入表名和列名,还有排序时使用 order by 动态参数时可以使用 ${ } 。
- 注:
一般能用 # 的就别用 $ ,若不得不使用 “ ${xxx} ” 这样的参数,要手工地做好过滤工作,以防止 SQL 注入攻击。
含义:
#{}:为占位符
${}:为拼接符
区别:
用法:
#{}:为参数占位符?,即 SQL 预编译
${}为字符串替换, 即字符串拼接
执行流程:
#{}:动态解析 --> 预编译 --> 运行
${}: 动态解析 --> 编译 --> 运行
变量替换:
#{}:变量替换是在 DBMS (数据库管理系统)中,会对对应的变量自动加上''
${}:变量替换实在 DBMS 外,不会对对应的变量加上''
sql注入:
#{}:可以防止 SQL 注入
${}:不可以防止 SQL 注入
使用技巧:
不论是单个参数还是多个参数,一律建议使用 @param("")
能用 #{ } 的地方尽量使用 #{ },减少 ${ }
表名作为参数时,必须使用 ${ }
order by 时,必须使用 ${ }
使用 ${} 时要注意何时加或不加单引号
Note:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中
© 2020 11 - Guyu.com | 【版权所有 侵权必究】 |