返回受Java中SQL UPDATE语句影响的行数

我正在使用MySQL数据库并通过Java访问它。

PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table SET Level = 'Super' WHERE Username = ?"); prep1.setString(1, username); 

上面的更新语句工作正常,但是我想获得受此语句影响的行数。 这可能吗?

在PreparedStatement上调用executeUpdate()应该返回一个int,即更新记录的数量。

根据JDBC规范, Statement.executeUpdate()execute()后跟getUpdateCount()将返回匹配但未更新的行数。 如果需要更新计数,可以将useAffectedRows=true指定为非标准URL选项 。 更多信息可在此处获得 。

  1. 首先,使用下面的构造函数准备’PreparedStatement’对象:

     PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
  2. 然后,将您的参数设置为’pStmt’。 在这种情况下:

     prep1.setString(1, username); 
  3. 最后,执行executeUpdate并将受影响的行作为整数获取

     int affectedRows = pStmt.executeUpdate(); 

刚才看到另一个类似的情况,我只想在真正改变的情况下做额外的工作,我认为最平台中立的方法是改变查询以排除设置字段匹配的情况:

 UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super' 

运行查询时返回该数字:

 int rows = prep1.executeUpdate(); System.out.printf("%d row(s) updated!", rows); 

如果有必要在不执行的情况下知道将影响多少行,则必须首先运行SELECT语句。

可以使用SQL%ROWCOUNT(对于ORACLE)或@@ ROWCOUNT(对于SQL SERVER)返回受SQL Update影响的行数

注意:为了返回更新,删除等行数。我们必须在存储过程中使用OUT参数,它将存储更新,删除等行数。

  1. 要获得更新,删除等行数,我们必须在Java中使用registerOutParameter方法

  2. 要将更新或删除的行数等存储到存储过程中的一个OUT参数中,我们必须在执行命令之前在脚本中设置该参数的类型。 (如果更新或删除,它将是NUMERIC)

  3. 执行命令后,通过调用该参数的索引将更新或删除的行的值存储到变量中(可以是新变量或类中可用的变量等)(例如:A = cs.getInt(3) )如果存储过程中的OUT参数是第二个参数)

  4. 现在,变量具有更新或删除的行的值(即A = 10)

存储的例子

 Function demo( A varchar2(10), B OUT NUMBER)RETURN NUMBER IS EXIST_LP NUMBER; BEGIN UPDATE demo_temp SET name=A where name="ABC"; B:=SQL%ROWCOUNT -- total number of rows updated RETRUN EXIST_LP; END demo; 

java脚本的示例

 public void update(demo demo){ int rowCount = 0; Connection conn = null; CallableStatement cs = null; try{ InitialContext ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("your data source path"); conn = ds.getConnection(); cs = conn.prepareCall("BEGIN ? :=demo_dbp.demo(?,?) ); END;"); // stored proc cs.registerOutParameter(1, Types.INTEGER); cs.setString(2, "XYZ"); cs.registerOutParameter(3, Types.NUMERIC); rowCount=cs.execcuteUpdate(); demo.setUpdateCount(cs.getInt(3)); } catch (SQLException exc) { throw new DaoException("An SQL Exception has occurred.", exc); } catch (NamingException ne) { throw new DaoException("A Naming Exception has occurred.", ne); } catch (Exception e) { throw new DaoException("An Exception has occurred", e); } finally { try { if (cs != null) { cs.close(); } } catch (SQLException ex1) { } try { if (conn != null) { conn.close(); } } catch (SQLException ex) { } } } 

注意: executeUpdate()不返回更新或删除的行数。 它只返回0或1。

  1. 0 – 执行失败
  2. 1 – 执行成功