利用jdbc操作数据库——prepareStatement和Statement的比较以及利用batch模式提高效率的心得

1.prepareStatement   vs  statement

(1)prepareStatement预编译SQL语句,批处理效率高

什么是预编译,好处?(参考https://blog.youkuaiyun.com/Marvel__Dead/article/details/69486947
当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译成可执行的函数,最后才是执行SQL语句。其中校验语法,和编译所花的时间可能比执行SQL语句花的时间还要多。
注意:可执行函数存储在MySQL服务器中,并且当前连接断开后,MySQL服务器会清除已经存储的可执行函数。
如果我们需要执行多次insert语句,但只是每次插入的值不同,MySQL服务器也是需要每次都去校验SQL语句的语法格式,以及编译,这就浪费了太多的时间。如果使用预编译功能,那么只对SQL语句进行一次语法校验和编译,所以效率要高。

看个例子:
statement:

stmt = conn.createStatement();
//循环
for(){
    stmt.executeUpdate(sql);
}

prepareStatement:

ps = conn.prepareStatement(sql);
//循环
for(){
    ps.setString(1,"");
    ps.setString(2,"");
    //...
    ps.executeUpdate();
}

对于prepare

### JDBCStatement类支持的SQL操作类型及方法 JDBC中的`Statement`类是执行SQL语句的核心接口之一,提供了多种方法来执行SQL语句并处理结果。以下是`Statement`类支持的主要SQL操作类型及其对应的方法[^3]。 #### 1. 执行查询操作 `Statement`类提供了一个方法用于执行查询操作,返回一个`ResultSet`对象以供进一步处理。 - **方法**: `ResultSet executeQuery(String sql)` - **描述**: 该方法用于执行SQL查询语句(如`SELECT`),返回的结果集可以通过`ResultSet`接口进行遍历访问。 - **示例**: ```java String sql = "SELECT * FROM employees WHERE department_id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, 10); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("name")); } ``` #### 2. 执行更新操作 `Statement`类提供了方法用于执行更新、插入或删除操作。 - **方法**: `int executeUpdate(String sql)` - **描述**: 该方法用于执行SQL数据操作语言(DML)语句,如`INSERT`、`UPDATE`或`DELETE`。它返回受影响的行数。 - **示例**: ```java String sql = "UPDATE employees SET salary = ? WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setDouble(1, 50000); pstmt.setInt(2, 101); int rowsAffected = pstmt.executeUpdate(); System.out.println("Rows affected: " + rowsAffected); ``` #### 3. 执行任意SQL语句 当不确定SQL语句的具体类型时,可以使用以下方法: - **方法**: `boolean execute(String sql)` - **描述**: 该方法用于执行任意类型的SQL语句。如果SQL语句是一个查询语句,则返回`true`;否则返回`false`。对于非查询语句,可以通过`getUpdateCount()`获取受影响的行数;对于查询语句,可以通过`getResultSet()`获取结果集。 - **示例**: ```java String sql = "CREATE TABLE IF NOT EXISTS test_table (id INT PRIMARY KEY, name VARCHAR(50))"; Statement stmt = connection.createStatement(); boolean isResultSet = stmt.execute(sql); if (!isResultSet) { int updateCount = stmt.getUpdateCount(); System.out.println("Update count: " + updateCount); } ``` #### 4. 批量执行SQL语句 `Statement`类还支持批量执行多个SQL语句。 - **方法**: - `void addBatch(String sql)` - `int[] executeBatch()` - **描述**: 使用`addBatch`方法将多个SQL语句添加到批处理队列中,然后通过`executeBatch`方法一次性执行所有SQL语句。该方法返回一个整型数组,表示每个SQL语句影响的行数。 - **示例**: ```java Statement stmt = connection.createStatement(); stmt.addBatch("INSERT INTO employees (id, name) VALUES (1, 'Alice')"); stmt.addBatch("INSERT INTO employees (id, name) VALUES (2, 'Bob')"); int[] updateCounts = stmt.executeBatch(); for (int count : updateCounts) { System.out.println("Rows affected in batch: " + count); } ``` #### 5. 管理事务 虽然事务管理主要由`Connection`类负责,但`Statement`类在事务环境中仍然扮演重要角色。 - **方法**: - `void setMaxRows(int max)` - `void setFetchSize(int rows)` - **描述**: 这些方法用于优化大结果集的处理,避免内存溢出问题[^2]。例如,通过设置`ResultSet.TYPE_FORWARD_ONLY``ResultSet.CONCUR_READ_ONLY`,可以限制结果集的行为,从而降低内存消耗。 ### 总结 `Statement`类支持的主要SQL操作包括查询(`executeQuery`)、更新(`executeUpdate`)、任意SQL语句执行(`execute`)以及批量执行(`addBatch`与`executeBatch`)。此外,还可以通过`Connection`类结合`Statement`实现事务管理功能[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值