如何处理SQL Query

时间:2016-01-12 08:28:24

标签: 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)+"'";

PreparedStatement stmt5 = nsdCon.prepareStatement(s);
ResultSet rs5 = stmt5.executeQuery();

Query可能如下所示:

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查询中的reserverd字符?

谢谢

5 个答案:

答案 0 :(得分:3)

请避免使用字符串连接创建带有提供参数的SQL查询。相反,您可以继续使用PreparedStatement,但使用占位符作为实际参数值,并使用语句set<X>()方法设置参数。这是official Oracle docs的问题。

  

您必须提供值代替问号占位符(如果   你可以执行PreparedStatement对象之前有任何一个。做   这可以通过调用其中一个setter方法来定义   PreparedStatement类。以下陈述提供了两个   名为updateSales的PreparedStatement中的问号占位符:

     

updateSales.setInt(1,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

答案 1 :(得分:3)

使用prepared statement(为了更明确命名绑定变量,您可以使用OraclePreparedStatement):

String s = "select ref(ad) from adresse_tab ad where ad.ort=:ort and ad.plz=:plz and ad.land=:land";
PreparedStatement st5 = nsdCon.prepareStatement(s);
OraclePreparedStatement ost5 = (OraclePreparedStatement) st5;
ost5.setStringAtName("ort",rs.getString(11))
ost5.setStringAtName("plz",rs.getString(13))
ost5.setStringAtName("land",rs.getString(14))
ResultSet rs5 = st5.executeQuery();

答案 2 :(得分:1)

您不应将查询参数直接添加到查询字符串中。请改用Prepared Statement并在那里传递查询参数。另请参阅Does the preparedStatement avoid SQL injection?

答案 3 :(得分:1)

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

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();

答案 4 :(得分:0)

ad.strasse='almundo l'''tare '