ibatis注入的问题!不是##形式能解决的!
在配置文件里配成 '%'||#变量名#||'%',或者干脆在配置文件里直接配成 #变量名# 的形式,然后在java代码中为这个变量字符串两边拼上 % ,可以实现模糊查询与避免被SQL注入,但如果我输入的查询字符串就是 % 的话,会变成全检索。麻烦高手给出合理的解决方法。
------最佳解决方案--------------------查了一下 把特殊字符用“[ ]”括起便可正常查询。 所以可以先对传入的查询条件进行
str.replaceAll("%","[%]")
------其他解决方案--------------------全搜索是非法结果 如果结果是全搜索 返回空就是了
------其他解决方案--------------------那我查询条件不输入,原本就是希望全检索,也查不出来了?还有就是,我是希望能查到含有 '%' 这个字符的又怎么办呢?我用的数据库是oracle,我觉得可能不是ibatis来解决,而是从sql 语句上可以排除,望高手指点。只记得sql server是有解决的sql语句的。
------其他解决方案--------------------你说的是在sql server里吧,在oracle里不认,是不会全检索了,但即使是“1232%31”这样符合条件的也查不出来了,不过还是谢谢你,分给你吧,我另有解决方法了。
------其他解决方案--------------------oracle中的模糊查询,带有特殊符号
用like语句查询的话可以,但是有特殊符号的话不能识别,如:#,%,_ 等
第一种方法:
可以用 regexp_like(字段名 ,'带有特殊符号的模糊字') 这个查询
例如:
select * from user_souce t
where to_char(t.us_time, 'yyyymmdd') = '20120615' and regexp_like(t.us_from, 'hello[Mr.hailey]');
第二种方法:转义特殊字符,转义符可以自己定义,用escape '转义符'定义即可
例如:
-- 查找所有包含'_'的
select * from emp where ename like '%?_%' escape '?'; --转义符为问号?
select * from emp where ename like '%/_' escape '/'; --转义符为斜杠/
--查找所有以_结尾的
select * from emp where ename like '%\_' escape '\'; --转义符为反斜杠\
同理,通过这种方法查找含有'%'的所有字段:
select * from emp where ename like '%\%%' escape '\';
但是'&'不能通过转义字符查找
如果按上面的写法,
select * from emp where ename like '%\&' escape '\';
会提示:ORA-01424: 转义符之后字符缺失或非法
可以通过另外的方式进行转义:
select ascii('&') from dual;
ASCII('&')
----------
38
select * from emp where ename like '%'