Statement.execute(sql) 与 executeUpdate(sql) 和 executeQuery(sql)

Posted

技术标签:

【中文标题】Statement.execute(sql) 与 executeUpdate(sql) 和 executeQuery(sql)【英文标题】:Statement.execute(sql) vs executeUpdate(sql) and executeQuery(sql) 【发布时间】:2013-05-13 14:27:33 【问题描述】:

我有一个与此方法相关的问题:st.execute(sql); 其中 st 显然是一个 Statement 对象。 直接来自thisoracle java教程:

execute:如果查询返回的第一个对象是一个 结果集对象。如果查询可以返回一个或 更多 ResultSet 对象。检索从返回的 ResultSet 对象 通过重复调用 Statement.getResutSet 进行查询。

一个或多个 ResultSet 对象”是什么意思?一旦获得ResultSet 的数组,如何管理它们? 而st.executeQuery(sql)st.executeUpdate(sql) 非常清楚。这不是(至少对我而言)st.execute(sql) 的目标,它也可以返回一个 int,就好像它更新了一个表一样。

提前致谢

【问题讨论】:

【参考方案1】:

布尔执行(): 执行此 Prepared Statement 对象中的 SQL 语句,可以是任何类型的 SQL 语句。

结果集 executeQuery(): 执行此 Prepared Statement 对象中的 SQL 查询,并返回查询生成的 ResultSet 对象。

int executeUpdate(): 执行此 Prepared Statement 对象中的 SQL 语句,该语句必须是 SQL INSERT、UPDATE 或 DELETE 语句;或不返回任何内容的 SQL 语句,例如 DDL 语句。

寻找此类问题答案的最佳位置是 Javadocs: Here

【讨论】:

【参考方案2】:

execute() : 用于所有类型 SQL 语句的方法,即返回布尔值 TRUE 或 FALSE。如果方法返回 TRUE,则返回 ResultSet 对象,FALSE 返回 int 值。

executeUpdate() : 该方法用于执行 DML 语句(INSERT、UPDATE 和 DELETE),返回 int 值,受影响的行数。

executeQuery() : 此方法用于使用 SELECT 查询从数据库中检索数据。该方法返回根据查询返回数据的ResultSet对象。

【讨论】:

【参考方案3】:

“一个或多个 ResultSet 对象”是什么意思?

execute 方法的 javadoc 是这样写的:

"执行给定的 SQL 语句,它可能会返回多个结果。在某些(不常见的)情况下,单个 SQL 语句可能会返回多个结果集和/或更新计数。通常您可以忽略这一点,除非您是 ( 1) 执行一个您知道可能返回多个结果的存储过程或 (2) 您正在动态执行一个未知的 SQL 字符串。"

这几乎解释了它。有时一个查询可以提供多个ResultSet

如果是这样,一旦获得了一个 ResultSet 数组,如何管理它们?

我不确定你的意思,但是:

您不能将它们作为一个数组获取:您必须一次获取一个,并且 您可以将 ResultSets 放入一个数组中...

这不是(至少对我而言)st.execute(sql) 的目标,它也可以返回一个 int,就好像它更新了一个表一样。

execute 的一个用途是执行 SQL 语句,如果您不知道它是查询、更新(某种类型的)......还是其他可能提供多个结果集的东西。它是executeQuery()executeUpdate() 的概括...

【讨论】:

以上是关于Statement.execute(sql) 与 executeUpdate(sql) 和 executeQuery(sql)的主要内容,如果未能解决你的问题,请参考以下文章

即使进行了更改,Statement.execute() 也会返回 false

通过 JDBC 检索 SQL Server 查询统计信息

Can not issue data manipulation statements with executeQuery()的解决方案

雪花声明在程序中不起作用

在java中分离sqlite数据库

我可以使用 MySQL Connector/J 执行多个用分号分隔的查询吗? [复制]