IN子句中的Java MySQL特殊字符

时间:2015-03-03 22:26:58

标签: java mysql sql escaping special-characters

Helllo家伙,

我正在使用Java在执行时组装一个查询字符串,该字符串应作为预准备语句在数据库上执行。由于我事先不知道IN子句中的参数个数,所以我不能使用固定参数(也就是'?'字符)所以我在Java中创建IN子句序列作为字符串,并在我的代码中替换它,如这样:

String statement = SQLUpdates.MYUPDATESTRING.replace("#INCLAUSE#", inList);

但是,变量inList中的字符串序列包含几个特殊字符,它们似乎打破了我的选择,众所周知的是数字符号字符(#)。有没有办法可以逃脱Java或我的SQL Select字符串?我不认为我可以在IN子句后使用ESCAPE子句,那么我的选择是什么?

1 个答案:

答案 0 :(得分:1)

原来我不得不用反斜杠逃避一些特殊字符。导致麻烦的字符是数字符号(#)和反斜杠()。

我使用的替换代码如下:

for (String key : keySet) {
   String key2 = key.replaceAll("\\\\", "\\\\\\\\");
   key2 = key2.replaceAll("#", "\\\\#");
   keyString.append("\"").append(key2).append("\"").append(", ");
}

FOR循环中的第一行用转义的双反斜杠(\)替换所有出现的反斜杠。请注意,反斜杠必须重复多次,因为您必须在Java中将其一次性转义,而对于正则表达式则必须再次转义。因此,单个反斜杠变为四个反斜杠(两次转义),双反斜杠变成一个八个反斜杠。相信我,它有效。

select中的第二行转义了数字符号,这是MySQL中的注释。这是在事后完成的,因为我们不想逃避用于逃避数字符号的反斜杠。

最后一行简单地连接字符串,使其看起来像一个以逗号分隔的列表,其中每个元素都用双引号括起来,例如:" 1"," 2" ," 3"等等,之后删除最后一个逗号。随后,最终列表将插入到选择中的适当位置。