动态sql是mybatis的强大特性之一也是这个框架优于其他框架的一个原因,mybatis在对sql进行预编译之前会对sql语句进行动态解析,#{}和${} 则会有不同的表现:
1.#{}在动态解析的时候回解析成 一个参数的标记符,会将sql中的#{}解析替换成一个?,最后注入的值是带引号的,例如:
解析前:select * from user where name = #{name} 解析后:select * from user where name = '姓名' 1 2 2.#{}是字符串替换,mybatis在处理${}时就是把它替换成变量的值,例如:
解析前:select * from user where name = ${name} 解析后:select * from user where name = 姓名 1 2 3.#{}防止sql注入:
#方式能够很大程度的防止sql注入。而$无法防止sql注入,所以在使用的时候用的比较多的是#{}来传参数
至于#能够防止sql注入是因为mybatis中的sql语句是预编译机制,预编译是提前对sql语句进行编译,而编译后传入的参数将不会再执行编译,一般的sql注入都是在编译的过程中被恶意注入了某些特殊字符,而预编译机制则可以很好的防止sql注入。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。