我需要使用 JDBC 语句更新 mySQL 中的记录 [重复]
Posted
技术标签:
【中文标题】我需要使用 JDBC 语句更新 mySQL 中的记录 [重复]【英文标题】:I need to update a record in mySQL using JDBC statements [duplicate] 【发布时间】:2020-07-31 18:17:43 【问题描述】:但是抛出异常:“java.sql.SQLException: Can not issue data operations statements with executeQuery()”。
public void updateClientsMoney(String name, String password, Long transactValue) throws SQLException
System.out.println("updateClientsMoney");
String query = "";
if(transactValue < 0)
query = String.format("UPDATE bank_client SET money %s where name = '%s'", transactValue, name);
else
query = String.format("UPDATE bank_client SET money %s where name = '%s'", transactValue, name);
try(Statement statement = connection.createStatement())
statement.executeQuery(query);
【问题讨论】:
使用executeUpdate()
而不是executeQuery()
【参考方案1】:
您正在对 DML 语句(即数据操作语句)使用 executeQuery 方法。 INSERT、UPDATE 和 DELETE 等操作属于这一类。您需要更新您的代码,如下所示
public void updateClientsMoney(String name, String password, Long transactValue) throws SQLException
System.out.println("updateClientsMoney");
String query = "";
if(transactValue < 0)
query = String.format("UPDATE bank_client SET money %s where name = '%s'", transactValue, name);
else
query = String.format("UPDATE bank_client SET money %s where name = '%s'", transactValue, name);
try(Statement statement = connection.createStatement())
statement.executeUpdate(query);
【讨论】:
【参考方案2】:除了报告的问题,此代码
按不太可能是唯一标识符的名称搜索客户 - 因此此查询将更新所有同名的钱, 有未使用的变量password
(可能它应该与name
一起使用),
不使用 PreparedStatement,这是防止 SQL 注入的常见最佳实践,
构建不正确的查询,将钱设置为 transactValue 使 if
毫无意义
因此,可以这样重构:
public void updateClientsMoney(String clientId, Long transactValue) throws SQLException
System.out.println("updateClientsMoney");
String query = "UPDATE bank_client SET money = money + ? WHERE id = ?";
try (PreparedStatement statement = connection.prepareStatement(query))
statement.setLong (1, transactValue.longValue());
statement.setString(2, clientId);
statement.executeUpdate();
更新:通过名称和密码识别客户
public void updateClientsMoney(String name, String password, Long transactValue) throws SQLException
System.out.println("updateClientsMoney");
String query = "UPDATE bank_client SET money = money + ? WHERE name = ? AND password = ?";
try (PreparedStatement statement = connection.prepareStatement(query))
statement.setLong (1, transactValue.longValue());
statement.setString(2, name);
statement.setString(3, password);
statement.executeUpdate();
【讨论】:
以上是关于我需要使用 JDBC 语句更新 mySQL 中的记录 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
2500-使用MyBatis操作MySQL进行批量更新的注意事项
最后插入的记录未反映在使用 JDBC 的 mysql 中的 select 语句中