在这个 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);
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);