Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理SQL查询中的保留字符_Java_Sql_Oracle_Object Oriented Database - Fatal编程技术网

Java 如何处理SQL查询中的保留字符

Java 如何处理SQL查询中的保留字符,java,sql,oracle,object-oriented-database,Java,Sql,Oracle,Object Oriented Database,我想从表中读取数据,但出现了一个错误,因为我要比较的值可能包含这样一个词:abcd l'jdmd 我试着这样做: String s = "select ref(ad) from adresse_tab ad where ad.ort='"+rs.getString(11)+"' and ad.plz='"+rs.getString(13)+"' and ad.land='"+rs.getString(14)+"'";

我想从表中读取数据,但出现了一个错误,因为我要比较的值可能包含这样一个词:abcd l'jdmd

我试着这样做:

String s = "select ref(ad) from adresse_tab ad where ad.ort='"+rs.getString(11)+"' and ad.plz='"+rs.getString(13)+"' and ad.land='"+rs.getString(14)+"'";
        
PreparedStatement stmt5 = nsdCon.prepareStatement(s);
ResultSet rs5 = stmt5.executeQuery();
select ref(ad) 
  from adresse_tab ad 
 where ad.ort='Frankfurt am Main' 
   and ad.plz='65301' 
   and ad.land='Deutschland' 
   and ad.strasse='almundo l'tare '
查询可能如下所示:

String s = "select ref(ad) from adresse_tab ad where ad.ort='"+rs.getString(11)+"' and ad.plz='"+rs.getString(13)+"' and ad.land='"+rs.getString(14)+"'";
        
PreparedStatement stmt5 = nsdCon.prepareStatement(s);
ResultSet rs5 = stmt5.executeQuery();
select ref(ad) 
  from adresse_tab ad 
 where ad.ort='Frankfurt am Main' 
   and ad.plz='65301' 
   and ad.land='Deutschland' 
   and ad.strasse='almundo l'tare '
因此,此查询中的问题是这种比较:

ad.strasse='almundo l'tare '

如何处理SQL查询中的保留字符?

不应将查询参数直接添加到查询字符串中。改为使用,并在那里传递查询参数。另请参见

准备语句的全部要点是在查询中使用参数,以便可以自动转义值:

String s = "select ref(ad) from adresse_tab ad where ad.ort=? and ad.plz=? and ad.land=?";
PreparedStatement stmt5 = nsdCon.prepareStatement(s);

stmt5.setString(1, rs.getString(11));
stmt5.setString(2, rs.getString(13));
stmt5.setString(3, rs.getString(14));

ResultSet rs5 = stmt5.executeQuery();

请避免使用字符串连接使用提供的参数创建SQL查询。相反,您可以继续使用PreparedStatement,但对实际参数值使用占位符,并使用语句的set方法设置参数。这是关于这个的

如果需要,则必须提供值来代替问号占位符 在可以执行PreparedStatement对象之前,存在任何错误。做 这可以通过调用 PreparedStatement类。下面的语句提供了这两种方法 名为updateSales的PreparedStatement中的问号占位符:

updateSales.setInt1,e.getValue.intValue; updateSales.setString 2,e.getKey;每种方法的第一个参数 这些setter方法指定问号占位符。在这个 例如,setInt指定第一个占位符和setString 指定第二个占位符

对于您的情况:

String s = "select ref(ad) from adresse_tab ad where ad.ort=? and ad.plz=? and ad.land=?";

PreparedStatement stmt5 = nsdCon.prepareStatement(s);
stmt5.setString(1, rs.getString(11));
... and so on
使用和为增加命名绑定变量的清晰度,您可以使用:


使用PeriaReDestEntest.StrString。你刚才得到的是SQL注入的一个例子,考虑使用参数而不是字符串连接,这将避免输入中的任何特殊字符。问题是,如果我事先不知道这个比较可能发生,我如何处理这个问题。如果您使用变量,oracle会处理的,您不会有任何问题-但您的问题是硬编码的。请使用问题的编辑链接,以上下文、详细信息和/或代码示例作为补充。“发布答案”按钮只能用于完整回答问题。这一点很好。命名参数更具可读性和可维护性。我希望Java能够提供开箱即用的功能,而不是依赖于它。