什么是 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......
广告