返回受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选项 。 更多信息可在此处获得 。
-
首先,使用下面的构造函数准备’PreparedStatement’对象:
PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?")
-
然后,将您的参数设置为’pStmt’。 在这种情况下:
prep1.setString(1, username);
-
最后,执行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参数,它将存储更新,删除等行数。
-
要获得更新,删除等行数,我们必须在Java中使用registerOutParameter方法
-
要将更新或删除的行数等存储到存储过程中的一个OUT参数中,我们必须在执行命令之前在脚本中设置该参数的类型。 (如果更新或删除,它将是NUMERIC)
-
执行命令后,通过调用该参数的索引将更新或删除的行的值存储到变量中(可以是新变量或类中可用的变量等)(例如:A = cs.getInt(3) )如果存储过程中的OUT参数是第二个参数)
-
现在,变量具有更新或删除的行的值(即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。
- 0 – 执行失败
- 1 – 执行成功
- 使用ImageIO.read获取错误(getClass()。getResourceAsStream(input == NULL)?
- 我为什么要使用嵌套类?
- 如何检查X509Certificate是否为CA证书?
- Java数组约定:String args与String args
- 在没有String的wicket中使用AutoCompleteTextField作为generics类型
- Java中System.out.println()的字符限制
- 即使没有内存,我会遇到java.lang.OutOfMemoryError吗?
- Java – 是否有像instanceof这样的“子类”?
- Java方法名称的有效字符是什么?