我正在使用 MySQL 数据库并通过 Java 访问它。
PreparedStatement prep1 = this.connection.prepareStatement(
"UPDATE user_table
SET Level = 'Super'
WHERE Username = ?");
prep1.setString(1, username);
上面的更新语句工作正常,但是我想获得受此语句影响的行数。请问这可能吗?
我正在使用 MySQL 数据库并通过 Java 访问它。
PreparedStatement prep1 = this.connection.prepareStatement(
"UPDATE user_table
SET Level = 'Super'
WHERE Username = ?");
prep1.setString(1, username);
上面的更新语句工作正常,但是我想获得受此语句影响的行数。请问这可能吗?
Statement.executeUpdate()
或execute()
后跟将根据 JDBC 规范返回匹配getUpdateCount()
的行数,而不是更新的行数。如果您想要更新的计数,您可以指定为非标准 URL 选项。更多信息可在此处获得。useAffectedRows=true
在 PreparedStatement 上调用executeUpdate()应该返回一个 int,即更新记录的数量。
首先,使用以下构造函数准备“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);
最后,执行更新并以整数形式获取受影响的行
int affectedRows = pStmt.executeUpdate();
刚才看一下另一个类似的情况,如果真的发生了变化,我只想做额外的工作,我认为最平台中立的方法是改变查询以排除设置字段匹配的情况:
UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
可以使用 SQL%ROWCOUNT (For ORACLE) 或 @@ROWCOUNT(FOR SQL SERVER) 返回受 SQL 更新影响的行数
注意:为了返回更新、删除等的行数。我们必须在存储过程中使用 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。
运行查询时会返回该数字:
int rows = prep1.executeUpdate();
System.out.printf("%d row(s) updated!", rows);
如果需要知道有多少行会在不执行的情况下受到影响,则必须先运行 SELECT 语句。