【问题标题】:I need to update a record in mySQL using JDBC statements [duplicate]我需要使用 JDBC 语句更新 mySQL 中的记录 [重复]
【发布时间】: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()

标签: java mysql sql jdbc


【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 2019-03-17
      • 2013-02-26
      • 2015-02-12
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      相关资源
      最近更新 更多