executeUpdate execute、executeBatch、executeQuery的区别

本文详细对比了execute、executeUpdate及executeBatch等SQL执行方法的功能与使用场景。execute适用于执行所有类型的SQL语句,并可通过getResultSet获取查询结果;executeUpdate专用于执行更新、插入和删除操作,返回受影响的行数;executeBatch则用于批量执行SQL语句,提高效率。

executeUpdate:执行数据库的更新、插入和删除操作 ,返回改变记录的行数
executeQuery:执行查询语句, 返回结果集
execute:兼具上面二者的功能
executeBatch:执行Vector中的n个SQL语句 即批量处理 要执行的sql语句

一、比较execute、executeUpdate的区别

1.相同点:

    execute与executeUpdate的相同点:都可以执行增加,删除,修改

2.不同点

不同1:

    execute可以执行查询语句,然后通过getResultSet,把结果集取出来。

    executeUpdate不能执行查询语句。

不同2:

    execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等。

    executeUpdate返回的是int,表示有多少条数据受到了影响。

executeBatch()方法:用于成批地执行SQL语句,但不能执行返回值是ResultSet结果集的SQL语句,而是直接执行stmt.executeBatch();
addBatch():向批处理中加入一个更新语句。
clearBatch():清空批处理中的更新语句

<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、付费专栏及课程。

余额充值