使用JDBC进行批处理
在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
JDBC实现批处理有两种方式: statement
和 preparedstatement
一、使用Statement完成批处理
1、使用Statement对象添加要批量执行SQL语句,如下:
1 2 3 | Statement.addBatch(sql1); Statement.addBatch(sql2); Statement.addBatch(sql3); |
2、执行批处理SQL语句: Statement.executeBatch();
3、清除批处理命令: Statement.clearBatch();
1.1、使用Statement完成批处理范例
1、编写测试的SQL脚本创建表
1 2 3 4 5 | create table testbatch ( id int primary key, name varchar( 20 ) ); |
2、编写测试代码,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package me.gacl.demo; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import me.gacl.utils.JdbcUtils; import org.junit.Test; /** * @ClassName: JdbcBatchHandleByStatement * @Description: 使用Statement实现JDBC批处理操作 * @author: 孤傲苍狼 * @date: 2014-9-20 下午10:05:45 * */ public class JdbcBatchHandleByStatement { @Test public void testJdbcBatchHandleByStatement(){ Connection conn = null ; Statement st = null ; ResultSet rs = null ; try { conn = JdbcUtils.getConnection(); String sql1 = "insert into testbatch(id,name) values(1,'aaa')" ; String sql2 = "insert into testbatch(id,name) values(2,'bbb')" ; String sql3 = "insert into testbatch(id,name) values(3,'CCC')" ; String sql4 = "insert into testbatch(id,name) values(4,'DDD')" ; String sql5 = "update testbatch set name='gacl' where id=1" ; String sql6 = "insert into testbatch(id,name) values(5,'FFF')" ; String sql7 = "delete from testbatch where id=2" ; st = conn.createStatement(); //添加要批量执行的SQL st.addBatch(sql1); st.addBatch(sql2); st.addBatch(sql3); st.addBatch(sql4); st.addBatch(sql5); st.addBatch(sql6); st.addBatch(sql7); //执行批处理SQL语句 st.executeBatch(); //清除批处理命令 st.clearBatch(); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtils.release(conn, st, rs); } } } |
1.2、采用Statement.addBatch(sql)方式实现批处理的优缺点
采用Statement.addBatch(sql)方式实现批处理:
优点:可以向数据库发送多条不同的SQL语句。
**缺点:**SQL语句没有预编译。
当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。
例如:
1 2 3 4 | Insert into user(name,password) values( 'aa' , '111' ); Insert into user(name,password) values( 'bb' , '222' ); Insert into user(name,password) values( 'cc' , '333' ); Insert into user(name,password) values( 'dd' , '444' ); |
二、使用PreparedStatement完成批处理
2.1、使用PreparedStatement完成批处理范例
测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package me.gacl.demo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import me.gacl.utils.JdbcUtils; import org.junit.Test; /** * @ClassName: JdbcBatchHandleByStatement * @Description: 使用prepareStatement实现JDBC批处理操作 * @author: 孤傲苍狼 * @date: 2014-9-20 下午10:05:45 * */ public class JdbcBatchHandleByPrepareStatement { @Test public void testJdbcBatchHandleByPrepareStatement(){ long starttime = System.currentTimeMillis(); Connection conn = null ; PreparedStatement st = null ; ResultSet rs = null ; try { conn = JdbcUtils.getConnection(); String sql = "insert into testbatch(id,name) values(?,?)" ; st = conn.prepareStatement(sql); for ( int i= 1 ;i< 1000008 ;i++){ //i=1000 2000 st.setInt( 1 , i); st.setString( 2 , "aa" + i); st.addBatch(); if (i% 1000 == 0 ){ st.executeBatch(); st.clearBatch(); } } st.executeBatch(); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtils.release(conn, st, rs); } long endtime = System.currentTimeMillis(); System.out.println( "程序花费时间:" + (endtime-starttime)/ 1000 + "秒!!" ); } } |
2.2、采用PreparedStatement.addBatch()方式实现批处理的优缺点
采用PreparedStatement.addBatch()实现批处理
优点:发送的是预编译后的SQL语句,执行效率高。
缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
关于JDBC批处理的内容就总结这么多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异