`
kanpiaoxue
  • 浏览: 1748130 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

mybatis中的#和$的区别

 
阅读更多

参考地址:https://blog.csdn.net/zymx14/article/details/78067452

官网地址:http://www.mybatis.org/mybatis-3/sqlmap-xml.html#Parameters

官网地址章节:"Parameters -> String Substitution" 具体讲解了#和$的区别。

 

使用${}方式传入的参数,mybatis不会对它进行特殊处理,而使用#{}传进来的参数,mybatis默认会将其当成字符串。可能在赋值给如id=#{id}和id=${id}看不出多大区别,但是作为表名或字段参数时可以明显看出,可以看看下面的例子:

假设传入的参数为表名test

selec * from #{table};

 解析后是:

select * from 'test';

 对于下面的SQL

select * from ${table};

 解析后是: 

select * from test;

 很明显,上面例子中第一个SQL使用#解析之后SQL运行出错,第二个SQL可以正常执行。

所以对于传入分组(group by)字段或者排序字段(order by),应使用${},避免出现order  by 'id' 等情况。

 

#和$在预编译处理中是不一样的。#类似jdbc中的PreparedStatement,对于传入的参数,在预处理阶段会使用?代替,比如:

select * from student where id = ?;

 待真正查询的时候即在数据库管理系统中(DBMS)才会代入参数。

而${}则是简单的替换,如下:

select * from student where id = 2;

 总结

1、能使用#{}的地方应尽量使用#{}

2、像PreparedStatement ,#{}可以有效防止sql注入,${}则可能导致sql注入成功。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics