当前位置: 首页 > 知识库问答 >
问题:

Java中的语句问题

方英耀
2023-03-14

这是我的方法:

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

这是我的测试主测试:

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对象工作,打开连接工作,我的find all records方法工作,然后我的deleteOneRecord崩溃。我收到以下错误:

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

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

任何帮助都将不胜感激。

共有1个答案

林丁雷
2023-03-14

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

 类似资料:
  • 我不太明白java中语句的定义。我在网上读了很多页,还有其他问题,但没有一个能给我一个准确的答案。 我们这里有多少陈述? 我想说,这是一个声明。然而,我们也可以这样写: 这是两个声明,对吗?

  • 我对< code>where子句中的case语句有一些问题。如果有人知道如何解决这个问题,请帮助我!谢谢你。 下面是日志中的错误: 原因:org.hibernate.hql.internal.ast.QuerySyntaxException: 意外的 AST 节点: 和靠近第 1 行, 列 589 [从 com.itengine.bettinggateway.dao.事件中选择 e.事件 tp.事

  • 本文向大家介绍Java中的Switch语句,包括了Java中的Switch语句的使用技巧和注意事项,需要的朋友参考一下 switch语句允许针对值列表对变量进行相等性测试。每个值称为一个案例,并针对每种情况检查要打开的变量。首先让我们看一下语法- 以下是适用于Java中switch语句的规则- switch语句中使用的变量只能是整数,可转换整数(字节,短整数,字符),字符串和枚举。 开关内可以有任

  • 本文向大家介绍Java中无法访问的语句错误,包括了Java中无法访问的语句错误的使用技巧和注意事项,需要的朋友参考一下 由于多种原因导致无法编译代码时,发生无法访问的代码错误,其中包括:无限循环,无法访问的代码行之前的return语句。 让我们看一个例子- 示例 输出结果 名为Demo的类包含主函数,并定义了一个值,并检查该值并运行空的“ for”循环。如果找到该值,则控件会跳出循环,否则将显示一

  • 我有个商品表里面有30多万的数据,商品标题是中文,系统模糊查询的时候老是会显示慢,同时我在这个字段创建了一个普通索引;但是查询还是会慢?请教高手要如何进行优化? select * from goods_name where title_name like "%电器%"

  • 代码: 作业: 在直角三角形中,最长边长度的平方等于其他两条边长度的平方之和。编写一个程序,提示用户输入三角形三条边的长度,然后输出一条消息,指示三角形是否为直角三角形。无论输入三条边的长度顺序如何,该程序都可以正常工作。 我的问题:代码无法编译,找到:变量,必需:值 另外:我不知道如何制作,这样程序就可以知道三角形是否正确,即使边没有按顺序给出。请帮忙,我是一个初学者,在这项作业上有很多困难。