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

时间:2010-04-03 16:48:24

标签: java mysql sql prepared-statement rowcount

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

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

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

7 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:39)

根据JDBC,

Statement.executeUpdate()execute()后跟getUpdateCount()将返回匹配行,而不是更新行数规范。如果您想要更新计数,可以将useAffectedRows=true指定为non-standard URL option。有关详细信息,请here

答案 2 :(得分:5)

  1. 首先,准备好准备好的声明'使用下面的构造函数的对象:

    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();
    

答案 3 :(得分:3)

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

<!doctype html>
<html>
<head>
<title>Sticky footer</title>
<meta charset="UTF-8"/>
<style>
html, body {
height: 100%;
background: #e4e4e4;
margin: 0px;
padding: 0px;
}
.wrapper {
min-height: 100%;
width: 100%;
}
.main {
clear: both;
overflow: auto;
padding-bottom: 100px;
}
footer {
margin-top: -100px;
background-color: #1b1e25;
height: 100px;
line-height: 100px;
text-align: center;
color: #fff;
}

</style>
</head>
<body>
<div class="wrapper">
<div class="main">
<p>Some content</p>
</div>
</div>

<footer>
<p>footer</p>
</footer>
</body>
</html>

答案 4 :(得分:1)

运行查询时返回该数字:

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

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

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

  4. 现在,变量的值已更新或已删除 (i.e.A = 10)

  5. 存储过程的示例

    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 - 执行成功