jdbc基础 (四) 批处理
批处理,就是字面上的意思,一次性处理一批sql语句。
直接看例子吧:
1 package com.cream.ice.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 import org.junit.Test; 9 10 /** 11 * 12 * 假设已经存在表test: 13 * create table test( 14 * id int primary key, 15 * name varchar(20) 16 * ); 17 * 18 * @author ice 19 * 20 */ 21 22 public class Batch { 23 private Connection connection; 24 private Statement statement; 25 private PreparedStatement preStatement; 26 private ResultSet resultSet; 27 28 /** 29 * 向ttest中插入2条记录,删除掉第1条 30 * 由于批处理的多条语句不同,所以使用Statement进行批处理 31 */ 32 @Test 33 public void testBatch1() { 34 try { 35 connection = JdbcUtils.getConnection(); 36 statement = connection.createStatement(); 37 38 String sql1 = "insert into test (id,name) values(1,'Tom')"; 39 String sql2 = "insert into test (id,name) values(2,'Jack')"; 40 String sql3 = "delete from test where id=1"; 41 42 // 内部维护了一个List,将sql语句加到List中 43 statement.addBatch(sql1); 44 statement.addBatch(sql2); 45 statement.addBatch(sql3); 46 47 // 执行批处理 48 int num[] = statement.executeBatch(); 49 50 // i为每条语句影响到的行数 51 for (int i : num) 52 System.out.print(i + " "); 53 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } finally { 57 JdbcUtils.releaseResources(null, statement, connection); 58 } 59 } 60 61 /** 62 * 向test中插入100条记录 63 * 由于语句完全相同,只是参数不同,使用PreparedStatement 64 */ 65 @Test 66 public void testBatch2() { 67 try { 68 connection = JdbcUtils.getConnection(); 69 70 String sql = "insert into test (id,name) values(?,?)"; 71 72 preStatement = connection.prepareStatement(sql); 73 74 // 要插入100条记录 75 for (int i = 0; i < 100; i++) { 76 preStatement.setInt(1, i + 1); 77 preStatement.setString(2, "No." + (i + 1)); 78 preStatement.addBatch(); 79 } 80 81 // 执行批处理语句 82 preStatement.executeBatch(); 83 84 statement=connection.createStatement(); 85 resultSet=statement.executeQuery("select * from test"); 86 87 //将插入记录打印到控制台上 88 while(resultSet.next()){ 89 System.out.print("id:"+resultSet.getInt("id")+" "); 90 System.out.println("name:"+resultSet.getString("name")); 91 } 92 93 } catch (Exception e) { 94 e.printStackTrace(); 95 } finally { 96 JdbcUtils.releaseResources(null, preStatement, connection); 97 JdbcUtils.releaseResources(resultSet, statement, connection); 98 } 99 } 100 }
代码里使用了工具类JdbcUtils,可参阅jdbc基础 (二) 通过properties配置文件连接数据库中的实现。
第一个例子中由于批处理的多条语句不同,所以使用Statement进行批处理。
第二个例子中由于语句完全相同,只是参数不同,使用PreparedStatement来处理。
这里值得注意的是,在第二个例子中,如果批处理语句数量不是100,而是达到几十万或上百万条,则在mysql中是极为耗时的,需要若干小时才可处理完,但如果换成oracle数据库,只需几十秒便可完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix