知道的进来说说。
偶不是谈论##和$$,而是ibatis会不会处理查询条件中带的单引号,比如会比一个单引号替换成两个单引号。因为在
SQL查询时,如果查询条件中有单引号是查询会报错的。要替换成两个单引号才可以。
比如:select * from user where uname = 'wang'ku'这句话执行会报错。应该这样:select * from user where uname = 'wang''ku'
就没问题。我们页面上的查询条件有时候会经常会带单引号,比如,英文地址。还有其它的。
这个时候我们就需要过滤页面上的单引号,把一个单引号替换成两个单引号来进行查询。现在偶用的spring 2.5.对象都是spring自动接收然后赋值进去的。而且用 ibatis的时候,也是传的对象进去。这个过程不便对对象中的属性进行单引号替换。我试过在对象属性的set方法里面,replace("'","''");可是在查询完成后,在页面上面依然要把查询条件带到页面上来。这个时候页面上面就会显示两个单引号了不行在get里面写,也不行主要就是在想ibatis里面有没有什么方法,可以在执行SQL语句的时候,自动把单引号替换成双引号。这样就万事OK了。上网搜了很久哦。。都是说##和$$的区别。。有没有大哥碰到过这样。。或都有没有更好的方法。。我还有想过,在页面上面提交表单的时候,检查表单值有没有输入单引号,这个时候就替换成两个单引号的。不过就还是在显示的时候有问题。
因为查询完成后,依然要把查询条件带到页面上面来。。这样显示的时候就会两个单引号。。如果在显示的时候再把两个单引号替换成一个单引号。。
我会狂晕。。这样是不是很麻烦啊。。说到底,ibatis这么大的一个框架,我想应该有办法解决这个问题的吧。主要就是在想ibatis里面有没有什么方法,可以在执行SQL语句的时候,自动把单引号替换成双引号。这样就万事OK了

解决方案 »

  1.   

    估计要改源文件吧LZ你在数据操作前替代不行吗?应该OK吧?
      

  2.   

    说到底,ibatis这么大的一个框架,我想应该有办法解决这个问题的吧。 
    他的解决方案就是使用预编译sql,而且这不是ibatis推荐的
    使用##即可,
    $$的用途并不是传参数。而是动态生成sql,当然可以用它传参
    经我测试sql长度非常长,参数非常多的时候jdbc的预编译会比较慢,这时候使用$$是有意义的,可以提升速度,但
    一般情况下##才是正道。谈了这么多,又回到了##和$$,你问的问题,好比是问,不用钥匙怎么开锁
    我在看来你替换'的方法风险是很高的。但是这种设计不好。让人看起来很奇怪。
      

  3.   

    归根结底还是##和$$的问题如果你用##,那这是用preparestatemate形式,不会出现单引号不识别的情况
    比如
    select * from xxx where STR =#str#  此时str如果是"aa'aa",不会出现错误
    sql会生成select * from xxx where STR =?   而参数是:[哈'哈]如果你用$$形式,那相当于是直接替换字符串
    select * from xxx where STR =$str$  此时str如果是"aa'aa",不会出现错误
    sql会生成select * from xxx where STR ='aa'aa'会直接替换$str$,所以会出现错误所以你的代码用的不对,应该用#str#
      

  4.   

    写的有些错误,更正
    归根结底还是##和$$的问题如果你用##,那这是用preparestatemate形式,不会出现单引号不识别的情况
    比如
    select * from xxx where STR =#str#  此时str如果是"aa'aa",不会出现错误
    sql会生成select * from xxx where STR =?  而参数是:[哈'哈]如果你用$$形式,那相当于是直接替换字符串
    select * from xxx where STR =$str$  此时str如果是"aa'aa",会出现错误
    sql会生成select * from xxx where STR ='aa'aa'会直接替换$str$,所以会出现错误所以你的代码用的不对,应该用#str#
      

  5.   

    如果模糊查询,看了一下网上的改成'%'||#address#||'%'就可以了。呵呵。学习了。多谢大家,结帖了。
      

  6.   

    是啊,完全可以sqlserver 的话写'%'+#address#+'%' 
    ibatis只是个执行者。其他的东西完全要由程序员思考。
      

  7.   

    '%'||#address:VARCHAR#||'%'
    建议指明具体类型,这样你会少很多麻烦。