什么是JDBC中的参数化批处理更新?举例说明一下?

将一组INSERT或UPDATE或DELETE命令(产生更新计数值)组合在一起并立即执行它们,此机制称为批量更新。

如果您使用批处理更新传递带有参数的查询,则称为参数化批处理更新。

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

//创建一个Statement对象
Statement stmt = con.createStatement();
//设置自动提交false-
con.setAutoCommit(false);
//将语句添加到批处理
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')");
//执行批处理
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 {
      //获得连接
      String mysqlUrl = "jdbc:mysql://localhost/testDB";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //创建一个Statement对象
      Statement stmt = con.createStatement();
      //设置自动提交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();

      //执行批处理
      stmt.executeBatch();
      //保存更改
      con.commit();
      System.out.println("Records inserted......");
   }
}

输出结果

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