【问题标题】:mySQL PreparedStatement vs. Statement in JAVA [duplicate]mySQL PreparedStatement 与 JAVA 中的语句 [重复]
【发布时间】:2015-05-10 21:05:16
【问题描述】:

在我的程序中,我必须更新数据库中的数据。为此,我创建了一个 UPDATE 语句。只有更改的文本字段才应该更新。这是我程序的重要部分:

String update = "UPDATE members set " + TFArray[i].getUserData().toString() +" = \"" + TFArray[i].getText() +"\" WHERE MemberNr = " + m.getMemberNr() + ";";
System.out.println(update);
statement = DBConnection.connection.createStatement();
statement.executeUpdate(update);
DBConnection.connection.setAutoCommit(false); 
DBConnection.connection.commit();
DBConnection.connection.setAutoCommit(true);

这非常有效。但是对于一般的 UPDATE 语句,我想使用这样的准备好的语句:

String update = "UPDATE members SET ? = \" ? \" WHERE MEMBERNR = ?;";
ps = DBConnection.connection.prepareStatement(update);
ps.setString(1, TFArray[i].getUserData().toString()); 
ps.setString(2, TFArray[i].getText()); 
ps.setString(3, m.getMemberNr()); 
ps.addBatch(); 
DBConnection.connection.setAutoCommit(false); 
ps.executeBatch(); 
DBConnection.connection.setAutoCommit(true); 

有了这个字符串,我得到一个异常,指出参数超出范围 (3 > 2)。

有人有想法吗?

【问题讨论】:

    标签: java mysql jdbc prepared-statement


    【解决方案1】:

    您不能绑定列名。所以代码应该是这样的(小心sql注入!):

      String update = "UPDATE members SET " + TFArray[i].getUserData().toString() + " = ? WHERE MEMBERNR = ?";
      ps = DBConnection.connection.prepareStatement(update);
      ps.setString(1,TFArray[i].getText()); 
      ps.setString(2,m.getMemberNr()); 
      ps.addBatch(); 
      DBConnection.connection.setAutoCommit(false); 
      ps.executeBatch(); 
      DBConnection.connection.setAutoCommit(true); 
    

    【讨论】:

    • 感谢您的回答,但我想我会使用我的正常陈述。正如 Reimeus 所说,我应该避免 SQL 注入的风险。另一个原因是,我的 String 是在 FOR 循环之外定义的。所以我它不适用于索引“i”。
    【解决方案2】:

    准备好的语句参数仅适用于查询值而不是列名。由于SQL Injection的风险,应避免字符串连接

    String update = "UPDATE members SET FIELD = ? WHERE MEMBERNR = ?";
    

    【讨论】:

    • 哦,好的。这次真是万分感谢。我从来没有想过 SQL 注入...
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多