Ibatis中的#与$

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注入攻击的。

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

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


ibatis中的#和$有什么区别。
#:#name#,是指一个属性叫name,把name的值传进来。会在name的值的两侧加上引号。如:where name = #name#,name传进来的值是 李花花 ,那么上面的语句就会解读为where name = '李花花'。

$:$name$,是指一个属性叫name,就是把name的值原样放到sql语句中。两边不加引号。个人理解,这种写法,很少传什么名字之类的。基本上都是传字段的名称。如:order by $name$,name传进来的值是 id ,那么上面的语句就会解读为order by id。

猜你喜欢

转载自love5811.iteye.com/blog/1555674