execute、executeQuery和executeUpdate之间的区别

execute、executeQuery和executeUpdate之间的区别
JDBC中Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
1>方法executeQuery 
用于产生单个结果集(ResultSet)的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。
如:
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                "root","1234");
//使用Connection来创建一个Statment对象
Statement  stmt = conn.createStatement();
//执行查询语句
ResultSet rs =stmt.executeQuery("select * from teacher");
//把查询结果输出来
while (rs.next())
{
    System.out.println(rs.getInt(1) + "/t" +    rs.getString(2)); 
}
2>方法executeUpdate
    用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
如:
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                "root","1234");
//使用Connection来创建一个Statment对象
Statement  stmt = conn.createStatement(); 
//执行DML语句,返回受影响的记录条数
return stmt.executeUpdate(sql);
3>方法execute: 
    可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。
如:  //加载驱动
            Class.forName(driver);
         //获取数据库连接
            conn = DriverManager.getConnection(url , user , pass); 
            //使用Connection来创建一个Statment对象 
            stmt = conn.createStatement();
            //执行SQL,返回boolean值表示是否包含ResultSet 
            boolean hasResultSet = stmt.execute(sql); 
            //如果执行后有ResultSet结果集
            if (hasResultSet)
            {
                //获取结果集 
                rs = stmt.getResultSet();
                //ResultSetMetaData是用于分析结果集的元数据接口 
                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();
                //迭代输出ResultSet对象
                while (rs.next())
                {//依次输出每列的值
                    for (int i = 0 ; i < columnCount ; i++ ) 
                    {
                        System.out.print(rs.getString(i + 1) + "/t");
                    }
                    System.out.print("/n");
                } 
            }
            else 
            {
                System.out.println("该SQL语句影响的记录有" + stmt.getUpdateCount() + "条");
            } execute、executeQuery和executeUpdate之间的区别
JDBC中Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
1>方法executeQuery 
用于产生单个结果集(ResultSet)的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。
如:
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                "root","1234");
//使用Connection来创建一个Statment对象
Statement  stmt = conn.createStatement();
//执行查询语句
ResultSet rs =stmt.executeQuery("select * from teacher");
//把查询结果输出来
while (rs.next())
{
    System.out.println(rs.getInt(1) + "/t" +    rs.getString(2)); 
}
2>方法executeUpdate
    用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
如:
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                "root","1234");
//使用Connection来创建一个Statment对象
Statement  stmt = conn.createStatement(); 
//执行DML语句,返回受影响的记录条数
return stmt.executeUpdate(sql);
3>方法execute: 
    可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。
如:  //加载驱动
            Class.forName(driver);
         //获取数据库连接
            conn = DriverManager.getConnection(url , user , pass); 
            //使用Connection来创建一个Statment对象 
            stmt = conn.createStatement();
            //执行SQL,返回boolean值表示是否包含ResultSet 
            boolean hasResultSet = stmt.execute(sql); 
            //如果执行后有ResultSet结果集
            if (hasResultSet)
            {
                //获取结果集 
                rs = stmt.getResultSet();
                //ResultSetMetaData是用于分析结果集的元数据接口 
                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();
                //迭代输出ResultSet对象
                while (rs.next())
                {//依次输出每列的值
                    for (int i = 0 ; i < columnCount ; i++ ) 
                    {
                        System.out.print(rs.getString(i + 1) + "/t");
                    }
                    System.out.print("/n");
                } 
            }
            else 
            {
                System.out.println("该SQL语句影响的记录有" + stmt.getUpdateCount() + "条");
            } 
<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()`效率更高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值