什么是 JDBC 中的参数化批量更新?请举例说明?


将一组 INSERT 或 UPDATE 或 DELETE 命令(这些命令会生成更新计数值)组合在一起并立即执行,这种机制称为批量更新。

如果使用参数传递查询进行批量更新,则称为参数化批量更新。

通常,要执行批量更新,需要使用 **addBatch()** 方法添加所有必需的语句,并使用 **executeBatch()** 方法执行它们,如下所示:

//Creating a Statement object
Statement stmt = con.createStatement();
//Setting auto-commit false
con.setAutoCommit(false);
//Adding the statements to batch
stmt.addBatch("INSERT INTO Sales VALUES ('KeyBoard', 'Amith', 'January', 1000, 'Hyderabad')");
stmt.addBatch("INSERT INTO Sales VALUES ('Earphones', 'SUMITH', 'March', 500, 'Vishakhapatnam')");
stmt.addBatch("INSERT INTO Sales VALUES ('Mouse', 'Sudha', 'September', 200, 'Vijayawada')");
//Executing the batch
stmt.executeBatch();

如果您观察上面的代码,我们会反复将语句的某些部分添加到批处理中,而不是这样做,您可以执行参数化批量更新,其中您使用预处理语句并创建带有占位符的查询,并使用 setter 方法将值传递给这些占位符。

添加值时,需要将查询的每一组值添加到批处理中,然后立即执行它们。

创建参数化批量更新

要创建参数化批量更新,需要创建一个预处理语句,以使用占位符插入、更新或删除值。

使用 setXXX() 语句将值设置为占位符参数。使用 addbatch() 方法将每一组值添加到批处理中,最后使用 executeBatch 方法执行批处理。

**注意:**在将语句添加到批处理之前,需要使用 **con.setAutoCommit(false)** 关闭自动提交,并在执行批处理后,需要使用 **con.commit()** 方法保存更改。

示例

假设我们在数据库中创建了一个名为 Sales 的表,其描述如下:

+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| Product_Name      | varchar(255) | YES  |     | NULL    |       |
| Name_Of_Customer  | varchar(255) | YES  |     | NULL    |       |
| Month_Of_Dispatch | varchar(255) | YES  |     | NULL    |       |
| Price             | int(11)      | YES  |     | NULL    |       |
| Location          | varchar(255) | YES  |     | NULL    |       |
+-------------------+--------------+------+-----+---------+-------+

此示例尝试使用参数化批量更新将一组语句插入到上述表中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class ParameterizedBatchUpdate {
   public static void main(String args[])throws Exception {
      //Getting the connection
      String mysqlUrl = "jdbc:mysql://localhost/testDB";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //Creating a Statement object
      Statement stmt = con.createStatement();
      //Setting auto-commit false
      con.setAutoCommit(false);
      PreparedStatement pstmt = con.prepareStatement("INSERT INTO Sales VALUES (?, ?, ?, ?, ?)");
      pstmt.setString(1, "KeyBoard");
      pstmt.setString(2, "Amith");
      pstmt.setString(3, "January");
      pstmt.setInt(4, 1000);
      pstmt.setString(5, "Hyderabad");
      pstmt.addBatch();

      pstmt.setString(1, "Earphones");
      pstmt.setString(2, "Sumith");
      pstmt.setString(3, "March");
      pstmt.setInt(4, 500);
      pstmt.setString(5, "Vishakhapatnam");
      pstmt.addBatch();

      pstmt.setString(1, "Mouse");
      pstmt.setString(2, "Sudha");
      pstmt.setString(3, "September");
      pstmt.setInt(4, 500);
      pstmt.setString(5, "Vishakhapatnam");
      pstmt.addBatch();

      //Executing the batch
      stmt.executeBatch();
      //Saving the changes
      con.commit();
      System.out.println("Records inserted......");
   }
}

输出

Connection established......
Records inserted......

更新于: 2019-07-30

732 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告