Java 如何处理SQL查询中的保留字符
我想从表中读取数据,但出现了一个错误,因为我要比较的值可能包含这样一个词:abcd l'jdmd 我试着这样做: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)+"'";
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能够提供开箱即用的功能,而不是依赖于它。