execute、executeQuery和executeUpdate之间的区别

本文详细解释了JDBC中Statement接口提供的executeQuery、executeUpdate和execute三种执行SQL语句的方法的区别及其应用场景。executeQuery主要用于执行SELECT语句,返回结果集;executeUpdate用于执行INSERT、UPDATE、DELETE及DDL语句,返回受影响的行数;execute则适用于执行复杂的SQL语句,可能返回多个结果集或更新计数。

JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之间的区别

 

       Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。

       方法executeQuery
       用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。

       方法executeUpdate
       用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

       使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。


       方法execute:
       用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能

       execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
       因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。
       对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。
       当 SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):

((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))

       如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象,则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来检索下一个结果集。如上所述,如果 getResultSet 返回 null,则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。

       当 getMoreResults 返回 false 时,它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:

((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))

       下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数:


stmt.execute(queryStringWithUnknownResults);
while (true) {
int rowCount = stmt.getUpdateCount();
if (rowCount > 0) { // 它是更新计数
System.out.println("Rows changed = " + count);
stmt.getMoreResults();
continue;
}
if (rowCount == 0) { // DDL 命令或 0 个更新
System.out.println(" No rows changed or statement was DDL
command");
stmt.getMoreResults();
continue;
}

// 执行到这里,证明有一个结果集
// 或没有其它结果

ResultSet rs = stmt.getResultSet;
if (rs != null) {
. . . // 使用元数据获得关于结果集列的信息
while (rs.next()) {
. . . // 处理结果
stmt.getMoreResults();
continue;
}
break; // 没有其它结果

资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在 JDBC 中,PreparedStatement 接口提供了三种执行 SQL 语句的方法:executeQueryexecuteUpdate execute,它们的使用取决于 SQL 语句的类型返回结果。 executeQuery 方法 executeQuery 主要用于执行返回单个结果集的 SQL 语句,比如 SELECT 语句。这是处理查询操作时最常用的方法。当执行 executeQuery 时,查询结果会被封装到一个 ResultSet 对象中,方便程序逐行读取处理数据。例如,查询数据库中所有 AirEnvironmentPresent 记录的代码如下: executeUpdate 方法 executeUpdate 用于执行不返回结果集的 SQL 语句,如 INSERT、UPDATE、DELETE 以及 SQL 的 DDL(数据定义语言)语句(如 CREATE TABLE、DROP TABLE 等)。该方法返回一个整数值,表示受影响的行数。对于不涉及行操作的语句(如 CREATE TABLE),返回值为 0。例如,创建一个表的代码如下: execute 方法 execute 方法是一个通用的执行方法,可以用于执行任何类型的 SQL 语句,包括返回多个结果集、多个更新计数或两者的组合。它也可以用于执行 INSERT、UPDATE 或 DELETE 语句。例如,插入一条记录的代码如下: 总结来说,executeQuery 用于查询操作,返回单个结果集;executeUpdate 用于执行不返回结果集的操作,返回受影响的行数;而 execute 是一个更通用的方法,适用于更复杂的场景。
<think>我们正在讨论JDBC中的Statement接口的三个主要方法:execute, executeQuery, executeUpdate。 这些方法都用于执行SQL语句,但它们的用途返回结果有所不同。 1. executeQuery: 用于执行返回单个结果集的SQL语句,主要是SELECT查询。 返回值是一个ResultSet对象,该对象包含查询返回的数据。 2. executeUpdate: 用于执行SQL INSERT, UPDATE, DELETE语句以及DDL(数据定义语言)语句(如CREATE TABLE, DROP TABLE等)。 返回值是一个整数,表示受影响的行数(对于INSERT/UPDATE/DELETE),对于DDL语句,返回0。 3. execute: 用于执行可能返回多个结果或多个更新计数的SQL语句。它是最通用的执行方法。 返回值是一个boolean值,指示第一个结果的形式。如果第一个结果是ResultSet,则返回true;如果是一个更新计数或没有结果,则返回false。 随后需要使用getResultSet()或getUpdateCount()来获取结果,以及getMoreResults()来移动到下一个结果。 下面我们将详细解释每个方法,并给出代码示例。 示例代码将使用JDBC来连接一个数据库(这里以MySQL为例),并展示这三个方法的使用。 注意:在实际使用中,应该使用PreparedStatement来代替Statement以防止SQL注入,并提高性能。这里为了演示区别,使用Statement。 我们将按照以下步骤进行: 1. 加载数据库驱动(对于较新的JDBC驱动版本,可以省略,通过SPI自动加载)。 2. 建立数据库连接。 3. 创建Statement对象。 4. 分别使用executeQueryexecuteUpdateexecute执行SQL语句。 5. 处理结果。 6. 关闭资源。 假设我们有一个名为“users”的表,其结构如下: CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), email VARCHAR(100) ); 接下来我们分别演示三个方法: </think>### JDBC Statement的executeexecuteQueryexecuteUpdate区别详解 #### 核心区别总结 | 方法 | 适用SQL类型 | 返回值 | 是否返回结果集 | 是否返回更新计数 | |------|-------------|--------|----------------|------------------| | `executeQuery` | SELECT | `ResultSet` | ✅ | ❌ | | `executeUpdate` | INSERT/UPDATE/DELETE/DDL | `int`(受影响行数) | ❌ | ✅ | | `execute` | 任意SQL(多结果集/存储过程) | `boolean` | ✅(可能) | ✅(可能) | --- ### 1. `executeQuery` - 查询专用 **用途**:执行返回结果集的SELECT语句 **返回值**:`ResultSet`对象(包含查询结果) **示例代码**: ```java try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); Statement stmt = conn.createStatement()) { String sql = "SELECT id, name FROM users WHERE age > 25"; ResultSet rs = stmt.executeQuery(sql); // 返回ResultSet while (rs.next()) { System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } ``` --- ### 2. `executeUpdate` - 更新专用 **用途**:执行数据修改操作(INSERT/UPDATE/DELETE)或DDL语句(CREATE/ALTER/DROP) **返回值**:`int`类型,表示受影响的行数(DDL语句返回0) **示例代码**: ```java try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); Statement stmt = conn.createStatement()) { // 插入数据 String insertSQL = "INSERT INTO users(name, age) VALUES ('Alice', 30)"; int insertCount = stmt.executeUpdate(insertSQL); System.out.println(insertCount + " row inserted"); // 输出: 1 // 更新数据 String updateSQL = "UPDATE users SET age=31 WHERE name='Alice'"; int updateCount = stmt.executeUpdate(updateSQL); System.out.println(updateCount + " row updated"); // 输出: 1 // 创建表(DDL) String createSQL = "CREATE TABLE logs (id INT, message VARCHAR(255))"; int ddlResult = stmt.executeUpdate(createSQL); System.out.println("DDL return: " + ddlResult); // 输出: 0 } catch (SQLException e) { e.printStackTrace(); } ``` --- ### 3. `execute` - 通用执行 **用途**: - 执行返回多个结果集的SQL(如存储过程) - 执行未知类型的SQL语句 **返回值**:`boolean` - `true`:首个结果是`ResultSet` - `false`:首个结果是更新计数或无结果 **结果处理流程**: ```mermaid graph LR A[execute(sql)] --> B{返回boolean} B -->|true| C[用getResultSet取结果集] B -->|false| D[用getUpdateCount取更新计数] C --> E[使用ResultSet] D --> F[处理更新行数] E & F --> G[调用getMoreResults移动下个结果] ``` **示例代码**: ```java try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); Statement stmt = conn.createStatement()) { String multiSQL = "UPDATE users SET score=100 WHERE id=1; SELECT * FROM users;"; boolean hasResultSet = stmt.execute(multiSQL); // 执行混合SQL // 处理第一个结果(UPDATE) if (!hasResultSet) { int updateCount = stmt.getUpdateCount(); System.out.println("UPDATE count: " + updateCount); } // 移动到下一个结果(SELECT) if (stmt.getMoreResults()) { try (ResultSet rs = stmt.getResultSet()) { while (rs.next()) { System.out.println("User: " + rs.getString("name")); } } } } catch (SQLException e) { e.printStackTrace(); } ``` --- ### ✨ 关键注意事项 1. **资源释放**: 所有`ResultSet``Statement`对象必须显式关闭(推荐使用try-with-resources) 2. **SQL注入风险**: 避免拼接SQL语句,优先使用`PreparedStatement` 3. **DDL特殊处理**: DDL语句在`executeUpdate`中返回0,在`execute`中返回`false` 4. **批量操作**: 多次调用`addBatch()`后使用`executeBatch()`效率更高
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值