java sql 字符串 转义_java拼接SQL语句的特殊字符转义

在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询。

如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入。

比如对输入的%和_和',就需要进行转义,因为这3个字符是SQL的特殊字符,如果不处理会导致sql出错或者是查询数据不正确。

假如有这样1个查询请求,模糊查询标题中包含a%b_cc'd的记录,正确的sql应该是下面这样的:

select * from t_sch_work_info t where  t.title like  '%a/%b/_cc''d%' ESCAPE '/';

这就需要对String content = "a%b_cc'd";进行转义后,再拼成SQL语句:

/**

*

* 对content的内容进行转换后,在作为oracle查询的条件字段值。使用/作为oracle的转义字符,比较合适。

* 既能达到效果,而且java代码相对容易理解,建议这种使用方式

* "%'" + content + "'% ESCAPE '/' "这种拼接sql看起来也容易理解

*

* @param content

* @return

*/

public static String decodeSpecialCharsWhenLikeUseBackslash(String content)

{

// 单引号是oracle字符串的边界,oralce中用2个单引号代表1个单引号

String afterDecode = content.replaceAll("'", "''");

// 由于使用了/作为ESCAPE的转义特殊字符,所以需要对该字符进行转义

// 这里的作用是将"a/a"转成"a//a"

afterDecode = afterDecode.replaceAll("/", "//");

// 使用转义字符 /,对oracle特殊字符% 进行转义,只作为普通查询字符,不是模糊匹配

afterDecode = afterDecode.replaceAll("%", "/%");

// 使用转义字符 /,对oracle特殊字符_ 进行转义,只作为普通查询字符,不是模糊匹配

afterDecode = afterDecode.replaceAll("_", "/_");

return afterDecode;

}

/**

* 对content的内容进行转换后,在作为oracle查询的条件字段值。使用\作为oracle的转义字符。

* 这种做法也能达到目的,但不是好的做法,比较容易出错,而且代码很那看懂。

* "%'" + content + "'% ESCAPE '\' "这种拼接sql实际上是错误的.

* "%'" + content + "'% ESCAPE '\\' "这种拼接sql才是正确的

*

* @param content

* @return

*/

public static String decodeSpecialCharsWhenLikeUseSlash(String content)

{

// 单引号是oracle字符串的边界,oralce中用2个单引号代表1个单引号

String afterDecode = content.replaceAll("'", "''");

// 由于使用了\作为ESCAPE的转义特殊字符,所以需要对该字符进行转义

// 由于\在java和正则表达式中都是特殊字符,需要进行特殊处理

// 这里的作用是将"a\a"转成"a\\a"

afterDecode = afterDecode.replaceAll("\\\\", "\\\\\\\\");

// 使用转义字符 \,对oracle特殊字符% 进行转义,只作为普通查询字符,不是模糊匹配

afterDecode = afterDecode.replaceAll("%", "\\\\%");

// 使用转义字符 \,对oracle特殊字符_ 进行转义,只作为普通查询字符,不是模糊匹配

afterDecode = afterDecode.replaceAll("_", "\\\\_");

return afterDecode;

}

在oracle中使用ESCAPE的时候,可以指定转义符号。通过上面的\和/的转义,发现更适合使用/来让程序变得更容易理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值