Java中的PreparedStatement问题

时间:2016-02-12 05:22:09

标签: java jdbc prepared-statement

这是我的方法:

 @Override
public void deleteOneRecord(String tableName, String id) throws ClassNotFoundException, SQLException{
   // Validate the parameters here.

   // String sql = "DELETE FROM " + tableName + " WHERE " + column + "=" + value;
    String pKeyColumnName = "";
   // Statement stmt = conn.createStatement();

    DatabaseMetaData dmd = conn.getMetaData();

    ResultSet rs = dmd.getPrimaryKeys(null, null, tableName);
    while(rs.next()){
        pKeyColumnName = rs.getString("COLUMN_NAME");
        System.out.println("PK column name is " + pKeyColumnName);
    }
    //String sql = "delete from " + tableName + " where " + pKeyColumnName + "=" + id;

    String sql2 = "delete from ? where ?=?";

    PreparedStatement pstmt = conn.prepareStatement(sql2);
    pstmt.setString(1, tableName);
    pstmt.setString(2, pKeyColumnName);
    pstmt.setInt(3, Integer.parseInt(id));

    pstmt.executeUpdate(); 
}

这是我的测试main

public static void main(String[] args) throws ClassNotFoundException, SQLException {
    DBStrategy db = new MySqlDBStrategy();
    db.openConnection("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/book", "root", "admin");
    System.out.println(db.findAllRecords("author", 0).toString());
    db.deleteOneRecord("author", "2");
    System.out.println(db.findAllRecords("author", 0).toString());
    db.closeConnection();

}

db对象工作,打开连接工作,我的查找所有记录方法工作, 然后我的deleteOneRecord爆炸了。我收到这个错误:

  

线程中的异常" main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在#"'作者'附近使用正确的语法。其中' author_id' = 2'在第1行

现在我的语法没有改变,我几分钟前运行这段代码只是一个Statement没问题,所以我必须以某种方式错误地使用PreparedStatement

任何帮助都将受到极大的赞赏。

1 个答案:

答案 0 :(得分:3)

我不相信您可以使用表名或列名的参数。您必须将这些连接到字符串中。根据它们的来源,请注意SQL注入漏洞!