【问题标题】:Beginner JDBC Result Set questions初学者 JDBC 结果集问题
【发布时间】:2011-04-04 20:44:42
【问题描述】:

刚开始使用 JDBC,我想知道是否所有操作都会产生结果集。例如,我正在声明通过以下方式插入/更新数据库:

StringBuffer query1 = new StringBuffer("UPDATE table SET col1 = value, WHERE some_col = some_val");
PreparedStatement pstmt1 = con.prepareStatment(query1.toString());
ResultSet rs1 = pstmt1.executeQuery();

那么这个 sn-p 在执行时会执行适当的更新并完成吗?或者我是否需要以某种方式处理结果集才能完成操作?

提前感谢您的帮助。

【问题讨论】:

  • 我正在遵循我的项目经理给我的各种模板。我是公司的新毕业生,所以我在学习的同时努力遵守他们的程序。

标签: java jdbc


【解决方案1】:

您应该使用PreparedStatement#executeUpdate() 而不是executeQuery()。它返回一个int,表示受影响的行数。

int affectedRows = preparedStatement.executeUpdate();

也就是说,以这种方式构造 SQL 字符串不是正常的习惯用法。您更愿意使用占位符 ? 并使用 PreparedStatement 设置器来设置值。

String sql = "UPDATE table SET col1 = ? WHERE some_col = ?";
// ...    
preparedStatement = connection.prepareStatment(sql);
preparedStatement.setString(1, col1);
preparedStatement.setString(2, someCol);
int affectedRows = preparedStatement.executeUpdate();
// ...

另见:

【讨论】:

  • 感谢您的链接。我在我的实际代码中使用 PreparedStatement 设置器。我可能应该在我的 sn-p 中更具体。我很抱歉。
【解决方案2】:

不,您不必处理 ResultSet - 无论如何它都是空的,因为更新操作不应该从数据库返回结果。通常你会在语句上调用不同的方法:

StringBuffer query1 = new StringBuffer("UPDATE table SET col1 = value, WHERE some_col = some_val");
PreparedStatement pstmt1 = con.prepareStatment(query1.toString());
int rowCount = pstmt1.executeUpdate();

【讨论】:

  • 其实在某些情况下UPDATE可以返回一个ResultSet,在这种情况下execute()应该和getResultSet()一起使用
  • @a_horse:这取决于 SQL 字符串,即使那样,您也更愿意使用 CallableStatement。我大致猜测您正在谈论返回插入 ID,因为 JDBC 提供了以后可以使用的 getGeneratedKeys() 方法(如果支持,您只依赖于 JDBC 驱动程序;截至目前,它们中的大多数都支持它,只有甲骨文的没有(还没有?))。另请参阅this question
  • 我不是在谈论 getGeneratedKeys()。一些 DBMS 支持“RETURNING”子句(用于 UPDATE、DELETE 和 INSERT 语句)。对于 UPDATE 语句,execute() 将返回一个包含所有修改行的结果集。 DELETE 语句将返回一个包含所有已删除行的结果集。
  • @a_horse: CallableStatement 因此。另请参阅链接。
  • 似乎依赖于 JDBC 驱动程序和 DBMS。我可以运行“DELETE FROM emp WHERE id > 42 RETURNING *”(在 PostgreSQL 中)。通过 execute() 运行时,getResultSet() 将返回一个包含所有已删除行的结果集。不需要 CallableStatement ;)
【解决方案3】:

此类语句还有另一种方法:
s.execute("..");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2020-01-04
    • 2020-11-23
    • 2015-03-16
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多