我正在使用MySQL数据库并通过Java访问它。
PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table
SET Level = 'Super'
WHERE Username = ?");
prep1.setString(1, username);
上面的更新语句工作正常,但是我想获得受此语句影响的行数。这可能吗?
答案 0 :(得分:41)
在PreparedStatement上调用executeUpdate()应该返回一个int,即更新记录的数量。
答案 1 :(得分:39)
Statement.executeUpdate()
或execute()
后跟getUpdateCount()
将返回匹配行,而不是更新行数规范。如果您想要更新计数,可以将useAffectedRows=true
指定为non-standard URL option。有关详细信息,请here。
答案 2 :(得分:5)
首先,准备好准备好的声明'使用下面的构造函数的对象:
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();
答案 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参数,它将存储更新,删除等行数。
要获取更新,删除等行数,我们必须使用 Java中的registerOutParameter方法
将更新或删除的行数等存储到其中一个 存储过程中的OUT参数我们必须设置它的类型 执行命令之前我们脚本中的参数。 (的情况下 更新或删除它将是NUMERIC)
执行命令后,存储已更新或已删除的值 行变换为变量(可以是新变量或变量 在类等中可用..)通过调用该参数的索引 (例如:如果存储过程中的OUT参数是,则A = cs.getInt(3) 第二个参数)
现在,变量的值已更新或已删除 (i.e.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。