我需要使用 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 语句中

mysql中的if语句?

java,jdbc,大量数据update更新效率很慢,哪位大神可怜可怜我吧

Web09_MySQL多表&JDBC

JDBC概述和连接MySQL数据库