将一组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......
本文向大家介绍什么是stub?举例说明相关面试题,主要包含被问及什么是stub?举例说明时的应答技巧和注意事项,需要的朋友参考一下 stub用于模块的行为。测试时,stub可以为函数调用返回模拟的结果。比如说,我们写文件时,实际上并不需要真正去写。 Stub是用于模拟一个组件/模块的一个函数或程序。在测试用例中,Stub可以为函数调用提供封装的答案。 当然,你还可以在断言中指明Stub是如何被调用
本文向大家介绍举例说明什么是IIFEs?它有什么好处?相关面试题,主要包含被问及举例说明什么是IIFEs?它有什么好处?时的应答技巧和注意事项,需要的朋友参考一下 Instantly Invoked Function Expression 即时调用函数表达式 示例 最好在 IIFE 前追加分号 来避免解析时与前一个表达式合并出现问题 好处 创建一个局部作用域隔离变量;但在 ES6 拥有了块级作用域
本文向大家介绍举例说明什么是decodeURI()和encodeURI()是什么?相关面试题,主要包含被问及举例说明什么是decodeURI()和encodeURI()是什么?时的应答技巧和注意事项,需要的朋友参考一下 :将 URI 中的每个字符编码为 1-4 个格式为 的转义序列(xx 为十六进制数),但不包括 ASCII 数字、字母、URL 分隔符(、、、、...)、以及其他部分 ASCII
本文向大家介绍举例说明什么是短路求值?相关面试题,主要包含被问及举例说明什么是短路求值?时的应答技巧和注意事项,需要的朋友参考一下 短路求值即利用 (逻辑或) 和 (逻辑与)的短路特性进行赋值: 当值为truthy时,取的值,否则取。这样可以避免被赋为、、、等值。 当值为truthy时,再去取并返回其值,否则返回。这样可以避免为空时,报空指针异常。
问题内容: 对于Java-JDBC API和Oracle数据库,我有一个稍微独特的要求。我将autoCommit设置为默认值,这对于Oracle是正确的,并且我使用的示例与此链接相似。 但是,当我添加说1000批次时,可以说每个批次都是插入的。并且让我们假设大约20条记录违反了某些约束,我希望其余980条变为COMMITTED(并且以后对使用任何其他连接的任何其他查询都可见)到数据库,并忽略20条
本文向大家介绍举例说明constructor和instanceof的区别是什么?相关面试题,主要包含被问及举例说明constructor和instanceof的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 是 的属性之一, 是运算符 的结果是方法, 的结果是布尔值 获取的是原型链的最顶层, 可以判断是否属于原型链的任意一层