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