使用 JDBC 预处理语句进行批量插入

jdbcobject oriented programmingprogramming

将一组 INSERT 语句分组并一次性执行称为批量插入。

使用 PreparedStatement 对象进行批量插入

使用 PreparedStatement 对象执行一批插入语句 −

  • 创建 PreparedStatement − 使用 prepareStatement() 方法创建 PreparedStatement 对象。将带有占位符"?"而不是值的插入查询作为参数传递给此方法。
PreparedStatement pstmt = con.prepareStatement("INSERT INTO Sales VALUES (?, ?, ?, ?, ?)");
  • 将值设置为占位符 − 使用 setXXX() 方法 (setInt(). SetString(), setFloat() 等…hellip;) 将值设置为 PrepareStatement 中的占位符作为 −
pstmt.setString(1, "KeyBoard");
pstmt.setString(2, "Amith");
pstmt.setString(3, "January");
pstmt.setInt(4, 1000);
pstmt.setString(5, "Hyderabad");
  • 将语句添加到批处理 −将记录的值设置为占位符后,使用 PreparedStatement 接口的 addBatch() 方法将其添加到批处理中,如下所示 −
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();
  • 执行批处理 − 最后使用 PreparedStatement 接口的 executeBatch() 方法执行批处理。
pstmt.executeBatch();

使用批量插入,我们可以减少通信开销并提高 Java 应用程序的性能。

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

示例

让我们使用 CREATE 语句在 MySQL 数据库中创建一个名为 Dispatches 的表,如下所示 −

CREATE table Dispatches (
   Product_Name, varchar(255)
   Name_Of_Customer, varchar(255)
   Month_Of_Dispatch, varchar(255)
   Price, int(11)
   Location, varchar(255)
);

以下 JDBC 程序尝试使用 Statement  对象一次性批量执行一组 INSERT 语句。

示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class BatchInserts_PreparedStatement {
   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();
      //Executing the batch
      stmt.executeBatch();
      //Saving the changes
      con.commit();
      System.out.println("Records inserted......");
   }
}

输出

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

如果您验证表的内容,您可以发现新插入的记录为 −

+--------------+------------------+-------------------+-------+----------------+
| Product_Name | Name_Of_Customer | Month_Of_Dispatch | Price | Location       |
+--------------+------------------+-------------------+-------+----------------+
| KeyBoard     | Amith            | January           | 1000  | Hyderabad      |
| Earphones    | SUMITH           | March             | 500   | Vishakhapatnam |
| Mouse        | Sudha            | September         | 200   | Vijayawada     |
+--------------+------------------+-------------------+-------+----------------+

相关文章