35

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

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

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

4

7 回答 7

49

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

于 2014-02-14T17:12:50.147 回答
47

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

于 2010-04-03T16:50:43.367 回答
6
  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. 最后,执行更新并以整数形式获取受影响的行

    int affectedRows = pStmt.executeUpdate();
    
于 2016-11-10T09:42:21.503 回答
2

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

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
于 2015-10-07T18:49:15.657 回答
1

可以使用 SQL%ROWCOUNT (For ORACLE) 或 @@ROWCOUNT(FOR SQL SERVER) 返回受 SQL 更新影响的行数

注意:为了返回更新、删除等的行数。我们必须在存储过程中使用 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--执行成功
于 2015-08-14T16:22:39.740 回答
0

运行查询时会返回该数字:

int rows = prep1.executeUpdate(); 
System.out.printf("%d row(s) updated!", rows); 
于 2010-04-03T16:50:40.077 回答
0

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

于 2010-04-03T16:59:20.430 回答