javaweb学习总结(三十六)——使用JDBC进行批处理

在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
  JDBC实现批处理有两种方式:statement和preparedstatement

一、使用Statement完成批处理

  1、使用Statement对象添加要批量执行SQL语句,如下:

1 Statement.addBatch(sql1);
2 Statement.addBatch(sql2);
3 Statement.addBatch(sql3);

  2、执行批处理SQL语句:Statement.executeBatch();
  3、清除批处理命令:Statement.clearBatch();

1.1、使用Statement完成批处理范例

  1、编写测试的SQL脚本创建表

1  create table testbatch
2 (
3      id int primary key,
4      name varchar(20)
5 );

  2、编写测试代码,如下所示:

 1 package me.gacl.demo;
 2
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.Statement;
 6 import me.gacl.utils.JdbcUtils;
 7 import org.junit.Test;
 8
 9 /**
10 * @ClassName: JdbcBatchHandleByStatement
11 * @Description: 使用Statement实现JDBC批处理操作
12 * @author: 孤傲苍狼
13 * @date: 2014-9-20 下午10:05:45
14 *
15 */
16 public class JdbcBatchHandleByStatement {
17
18     @Test
19     public void testJdbcBatchHandleByStatement(){
20         Connection conn = null;
21         Statement st = null;
22         ResultSet rs = null;
23         try{
24             conn = JdbcUtils.getConnection();
25             String sql1 = "insert into testbatch(id,name) values(1,‘aaa‘)";
26             String sql2 = "insert into testbatch(id,name) values(2,‘bbb‘)";
27             String sql3 = "insert into testbatch(id,name) values(3,‘CCC‘)";
28             String sql4 = "insert into testbatch(id,name) values(4,‘DDD‘)";
29             String sql5 = "update testbatch set name=‘gacl‘ where id=1";
30             String sql6 = "insert into testbatch(id,name) values(5,‘FFF‘)";
31             String sql7 = "delete from testbatch where id=2";
32             st = conn.createStatement();
33             //添加要批量执行的SQL
34             st.addBatch(sql1);
35             st.addBatch(sql2);
36             st.addBatch(sql3);
37             st.addBatch(sql4);
38             st.addBatch(sql5);
39             st.addBatch(sql6);
40             st.addBatch(sql7);
41             //执行批处理SQL语句
42             st.executeBatch();
43             //清除批处理命令
44             st.clearBatch();
45         }catch (Exception e) {
46             e.printStackTrace();
47         }finally{
48             JdbcUtils.release(conn, st, rs);
49         }
50     }
51 }

1.2、采用Statement.addBatch(sql)方式实现批处理的优缺点

  采用Statement.addBatch(sql)方式实现批处理:
    优点:可以向数据库发送多条不同的SQL语句。
    缺点:SQL语句没有预编译。
    当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。例如:

1 Insert into user(name,password) values(‘aa‘,‘111‘);
2 Insert into user(name,password) values(‘bb‘,‘222‘);
3 Insert into user(name,password) values(‘cc‘,‘333‘);
4 Insert into user(name,password) values(‘dd‘,‘444‘);

二、使用PreparedStatement完成批处理

2.1、使用PreparedStatement完成批处理范例

  测试代码如下:

 1 package me.gacl.demo;
 2
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import me.gacl.utils.JdbcUtils;
 7 import org.junit.Test;
 8
 9 /**
10 * @ClassName: JdbcBatchHandleByStatement
11 * @Description: 使用prepareStatement实现JDBC批处理操作
12 * @author: 孤傲苍狼
13 * @date: 2014-9-20 下午10:05:45
14 *
15 */
16 public class JdbcBatchHandleByPrepareStatement {
17
18     @Test
19     public void testJdbcBatchHandleByPrepareStatement(){
20         long starttime = System.currentTimeMillis();
21         Connection conn = null;
22         PreparedStatement st = null;
23         ResultSet rs = null;
24
25         try{
26             conn = JdbcUtils.getConnection();
27             String sql = "insert into testbatch(id,name) values(?,?)";
28             st = conn.prepareStatement(sql);
29             for(int i=1;i<1000008;i++){  //i=1000  2000
30                 st.setInt(1, i);
31                 st.setString(2, "aa" + i);
32                 st.addBatch();
33                 if(i%1000==0){
34                     st.executeBatch();
35                     st.clearBatch();
36                 }
37             }
38             st.executeBatch();
39         }catch (Exception e) {
40             e.printStackTrace();
41         }finally{
42             JdbcUtils.release(conn, st, rs);
43         }
44         long endtime = System.currentTimeMillis();
45         System.out.println("程序花费时间:" + (endtime-starttime)/1000 + "秒!!");
46     }
47 }

2.2、采用PreparedStatement.addBatch()方式实现批处理的优缺点

  采用PreparedStatement.addBatch()实现批处理
    优点:发送的是预编译后的SQL语句,执行效率高。
    缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。

  关于JDBC批处理的内容就总结这么多。

时间: 2024-12-26 20:14:38

javaweb学习总结(三十六)——使用JDBC进行批处理的相关文章

javaweb学习总结(三十四)——使用JDBC处理MySQL大数据

一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时是需要用程序把大文本或二进制数据直接保存到数据库中进行储存的. 对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为: TINYTEXT.TEXT.MEDIUMTEXT和LONGTEXT TINYBLOB.BLOB.MEDIUMBLOB和L

JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据 量非常大的业务领域(如图象.档案等). LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序.图象.影音等).而CLOB,即字符型大型对象(Character Large Obj

javaweb学习总结(三十二)——JDBC学习入门【转】

原文地址:javaweb学习总结(三十二)——JDBC学习入门 一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后 才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数 据库打交道,如下所示: 1.2.JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作

javaweb学习总结(三十二)——JDBC学习入门

一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道,如下所示: 1.2.JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC.这套接口由数据库厂商去实现,这

javaweb学习总结(三十八)——事务

一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句  update from account set money=money+100 where name='B';  update from account set money=money-100 where name='A'; 二.MySQL数据库中操作事务命令 1.编写测试SQL脚本,如下: 1 /*创建账户表*/ 2 create table acco

javaweb学习总结(四十六)——Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

javaweb学习总结(三十九)——数据库连接池

一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.如下图所示: 二.使用数据库连接池优化程序性能 2.1.数据库连接池的基本概念 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性

【转载】JMeter学习(三十六)发送HTTPS请求

Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. (一)设置HTTP请求 我们首先右键添加线程组,然后继续右键添加控制器,由于登陆操作只请求一次,因而选择仅一次控制器.接下来右键添加sampler->HTTP请求,设置HTTP请求.这里注意的地方首先是端口号,如果只是普通的HTTP协议,默认不填,而这里是HTTPS协议,因而填端口号443.另外“

javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素. WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象.JspFragment类中只定义了两个方法,如下所示: getJspCon