MyBatis/Ibatis中#和$的区别
- #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
- $将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
- #方式能够很大程度防止sql注入。
- $方式无法防止Sql注入。
- $方式一般用于传入数据库对象,例如传入表名.
- 一般能用#的就别用$..
关于#方式的防sql注入解释:
使用#会被Mybatis预编译, 用占位符的方式把参数放到sql中执行, 而$符号会直接执行
关于预编译:
数据库执行sql也会先编译下(有点类似于java),编译完后叫执行计划,等执行sql时就运行执行计划而不是sql,
也是说,预编译阶段会把参数外的sql先编译(所以叫预编译),告诉数据库我要执行这条,而不是参数中什么奇怪的语句,
以上属于个人见解,不足之处请多多指教
关于sql注入: https://www.cnblogs.com/zouqin/p/5314827.html
参考:https://www.cnblogs.com/wuyun-blog/p/4697144.html (上图参考了这里,将文字转成了图片)
参考:http://blog.csdn.net/downkang/article/details/12499197/