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

一、使用Statement完成批处理

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

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

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

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

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

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

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

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

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

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

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

二、使用PreparedStatement完成批处理

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

  测试代码如下:

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

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

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

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

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

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

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

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

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  3. 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)

    风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...

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

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  5. Python学习日记(三十六) Mysql数据库篇 四

    MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...

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

    一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句  update from account set mone ...

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

    Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. ...

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

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

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

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

随机推荐

  1. HTTP 错误 500.21 - Internal Server Error的解决方案

    开始菜单>所有程序>附件>命令提示符(以管理员的身份运行) 然后运行下面的命令注册: 32位机器: C:\Windows\Microsoft.NET\Framework\v4.0.3 ...

  2. Windows Server 2008 R2安装IIS

    在"服务器管理器"中选择"添加角色".   在"服务器角色"步骤选择"Web 服务器(IIS)".   "角色 ...

  3. .Net 组件技术概述

    1. 基本原理 组件是组件系统中功能的表现,没有组件就没有功能.特定接口是用于给组件管理程序来操纵.管理该组件,特定功能是组件需要完成的任务.在一个使用组件建立的产品中会随着功能数目的多少而会有多个组 ...

  4. Lisp与JAVA的酷毙结合——abcl

    最近看了一本叫做<黑客与画家>的书,其中对于Lisp语言大加褒奖.自己试着用了一下,虽然确实有反人类之嫌,但是确实是一门不错的语言,New Architect杂志上有一篇介绍ITA软件公司 ...

  5. AngularJS的学习网站及相关资源整理

    学习angularjs的网站及相关资源的整理,会不断更新. angularJs的官网:https://angularjs.org/       API文档:https://docs.angularjs ...

  6. 暑假集训(3)第二弹 -----Jungle Roads(Hdu1301)

    问题梗概:自从上次某个acmer来设计了拉格瑞圣岛的交通路线后,岛上的酋长就相当苦恼,他发现,虽然这些修好的公路便利了岛上的 交通,并且让拉格瑞圣岛的旅游业更加兴旺,甚至他们还收到了一笔不小的国际资金 ...

  7. WTL 中的常见问题汇总

    1.CRect,CPoint,CSize的使用 WTL提供了CString,CRect,CPoint和CSize,可能后来版本的ATL也提供了,WTL作者推荐使用ATL的实现,所以:#include ...

  8. MySQL字符串类型转换时间类型

    如果MySQL数据库里面的某个时间用的是varchar(或者是char)类型的,这样可以方便系统使用而不用随便转换时间类型来适应数据库版本的不同,当要把取出的字段转换成时间类型的时候,可以按如下方法操 ...

  9. PHP之session_start()详解

    1.session的工作原理 (1)首先使用session_start()函数进行初始换 (2)当执行PHP脚本时,通过使用$_SESSION超全局变量注册session变量. (3)当PHP脚本执行 ...

  10. Oracle wrap 测试的一些细节问题

    今天在做 wrap 的测试实验的时候,出现一个很奇怪的现象,就是加密不成功.具体表现为:1.加密后的文件大小为0kb. 2.加密后的文件仍然可视. 具体测试步骤如下: D:\Just4work\som ...