java - Java 中的 PreparedStatement 问题

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

}

数据库对象有效,打开连接有效,我的查找所有记录方法有效, 然后我的 deleteOneRecord 爆炸了。我收到此错误:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''author' where 'author_id'=2' at line 1

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

如有任何帮助,我们将不胜感激。

最佳答案

我认为您不能为表名或列名使用参数。您必须将它们连接到字符串中。根据它们的来源,小心 SQL 注入(inject)漏洞!

关于java - Java 中的 PreparedStatement 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35355364/

相关文章:

java - 在 Java 程序中使用结果集

java - 应该在哪里?放在PreparedStatement中?

PHP PDO 不插入新记录

java - 编译时间常数

java - Oracle 日期的无效年份异常

Java VarHandle 到带有 java.lang.foreign API 的 C 字符串

jdbc - 使用 logstash 和 jdbc 更新复杂的嵌套 elasticsearch 文档

java - JDBC 更新查询更新所有列,而实际上我只更新少数列

java - 使用 AND 或 OR 条件手动构建 SQL 查询时出现 MySql 语法错误异常

Java/Mysql : Get all resulted lines from a stored procedure and not only the last