由于新的系统网上商城中用到iBATIS,刚才在写代码的时候一直很郁闷,用“##”传参数时,一条SQL是

SQL代码
  1. select * from tbuser where id in (#ids#)  

参数使用的是string类型,值是“1,2,3,4”,然而一直查不到数据。想了N久,也不懂得如何解决。后来在baidu了一下,找到了一些相关资料,终于可以解决了。以下是一点资料整理。

由于使用"#id#"来传值,形成的SQL就是

SQL代码
  1. select * from tbuser where id in ("1,2,3,4")   

所以也就不能查询成功。正确的方式应该是使用"$"来传值,其SQL如下

SQL代码
  1. select * from tbuser where id in ($ids$)  

 

$和#的区别在于, $方式传进的参数值是直接生成到SQL文里面的

而#是作为PrepareStatement的(?)参数传进SQL里面的  

形式上看,$比#方式要灵活。不过,这两种方式是为了应对不同的问题的。

当用#方式传入画面上直接输入的值时能够很大程度上防止SQL注入攻击。

而用$方式传直接输入参数的时候,是无法防止SQL注入攻击的。

$方式主要是用来把数据库对象名当作参数传入。

这是#方式做不到的这种做法不太常见,一般只有在写共同逻辑的时候用

另外,从效率上来讲,也应当避免把能够用#方式传入的参数用$方式传入。