在这个 Java 项目中工作,我需要能够根据用户的请求从数据库中删除数据

Working on this Java project where I need to be able to delete data from the database on user's request

MySQL 中的查询正在运行:

DELETE FROM f9.yoo 
WHERE account_tags = '#8GGGJPUR9'

我可以删除 MySQL 中的数据,但问题是每当我尝试从我的 Java 应用程序中删除 account_tags 时,它都会抛出错误:

java.sql.SQLSyntaxErrorException: 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 'DELETE FROM f9.yoo WHERE account_tags = '#8GGGJPUR9'' at line 2

这是我的 Java SQL 查询:

Statement statement = dbConnection.createStatement();
String sql = "SELECT * FROM "+databaseName+"."+tableName+";\n" +
        "DELETE FROM "+databaseName+"."+tableName+"\n" +
        "WHERE account_tags = '"+AccountTag+"';";

statement.executeQuery(sql);

这个错误并没有给我太多帮助,所以我真的不知道程序出了什么问题。

你添加了吗allowMultiQueries=true

如果没有,那么您可以在向数据库发送连接请求时添加它。因此,您需要将 allowMultiQueries=true 附加到数据库 URL.

像这样:

String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";

String sql = "DELETE FROM "+databaseName+"."+tableName+"\n" +
        "WHERE account_tags = ?";
try (PreparedStatement statement = dbConnection.prepareStatement(sq)) {
    statement.setString(1, AccountTag);
    int updateCount = statement.executeUpdate();
    System.out.printf("%s: %d records deleted.%n", tableName, updateCount);
}

唯一使用的是 DELETE,应该使用 executeUpdate

一个肯定应该使用PreparedStatement,否则许多代码检查器会发出警报。它转义了 ' 之类的东西,处理参数类型和可能的转换,尤其是针对 SQL 注入 .

的安全功能
  • System.out 用法很糟糕,最好使用记录器。
  • try-with-resources 会自动关闭 PreparedStatement,即使出现异常或 break/return.
  • 当执行两个数据库操作时,使用两个(准备好的)语句似乎更好,因为第一个 returns 一个 ResultSet。

所以:

String sql = SELECT * FROM "+databaseName+"."+tableName + "\n" +
        "WHERE account_tags = ?";
try (PreparedStatement statement = dbConnection.prepareStatement(sq)) {
    statement.setString(1, AccountTag);
    try (ResultSet rs = statement.executeQuery()) {
        ...
    }
}

最好用 If 条件分隔语句:

String sql1="SELECT * FROM "+databaseName+"."+tableName;

String sql2="DELETE FROM "+databaseName+"."+tableName+" "+
            "WHERE account_tags = '"+AccountTag+"';

    statement.executeQuery(sql1);
    statement.executeUpdate(sql2);