一、批处理的介绍

在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。批处理只针对更新(增、删、改)语句,批处理没有查询什么事儿!

JDBC实现批处理有两种方式:statement和preparedstatement

可以多次调用Statement类的addBatch(String sql)方法,把需要执行的所有SQL语句添加到一个“批”中,然后调用Statement类的executeBatch()方法来执行当前“批”中的语句。

  • void addBatch(String sql):添加一条语句到“批”中;
  • int[] executeBatch():执行“批”中所有语句。返回值表示每条语句所影响的行数据;
  • void clearBatch():清空“批”中的所有语句。

注意:mysql是默认是没有开启批处理的,需要加参数:jdbc:mysql://localhost:3306/testdb?rewriteBatchedStatements=true

二、Statement批处理

1. 创建测试表

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

2. 执行代码

  1. package cn.zy.test;
  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. import cn.zy.utils.JdbcUtils;
  11.  
  12. public class BatchHandle {
  13. /*
  14. * 使用statement实现批处理
  15. */
  16. @Test
  17. public void BatchByStatement(){
  18. Connection conn = null;
  19. Statement st = null;
  20. ResultSet rs = null;
  21. try {
  22. conn = JdbcUtils.getConnection();
  23. String sql1 = "insert into testbatch(id,name) values(1,'aaa')";
  24. String sql2 = "insert into testbatch(id,name) values(2,'bbb')";
  25. String sql3 = "insert into testbatch(id,name) values(3,'CCC')";
  26. st = conn.createStatement();
  27. //添加要批量执行的SQL
  28. st.addBatch(sql1);
  29. st.addBatch(sql2);
  30. st.addBatch(sql3);
  31. //执行批处理
  32. st.executeBatch();
  33. //清除批处理命令
  34. st.clearBatch();
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }finally {
  38. JdbcUtils.release(conn, st, rs);
  39. }
  40. }
  41.  
  42. }

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

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

三、采用PreparedStatement实现批处理

代码如下:

  1. package cn.zy.test;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import org.junit.Test;
  7. import cn.zy.utils.JdbcUtils;
  8.  
  9. public class BatchHandle {
  10.  
  11. /*
  12. * 使用preparedstatement实现批处理
  13. */
  14. @Test
  15. public void BatchByPreparedStatement(){
  16. long starttime = System.currentTimeMillis();
  17. Connection conn = null;
  18. PreparedStatement st = null;
  19. ResultSet rs = null;
  20. try {
  21. conn = JdbcUtils.getConnection();
  22. String sql = "insert into testbatch(id,name) values(?,?)";
  23. st = conn.prepareStatement(sql);
  24. for(int i=1;i<100000;i++){
  25. st.setInt(1, i);
  26. st.setString(2, "dog"+i);
  27. st.addBatch();
  28. if(i%1000==0){
  29. st.executeBatch();
  30. st.clearBatch();
  31. }
  32. }
  33. st.executeBatch();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }finally{
  37. JdbcUtils.release(conn, st, rs);
  38. }
  39. long endtime = System.currentTimeMillis();
  40. System.out.println("程序花费时间:" + (endtime-starttime)/1000 + "秒!!");
  41. }
  42. }

可以看见插入百万条数据所需要的时间这里是:

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

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

JavaWeb学习总结(十一)--JDBC之批处理的更多相关文章

  1. Javaweb学习笔记7—JDBC技术

      今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容.   ps:我的思维是用的 ...

  2. JavaWeb学习总结-09 JDBC 学习和使用

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

  3. JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  4. javaweb学习总结(十一)——使用Cookie进行会话管理

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  5. javaweb学习总结十一(JAXP对XML文档进行DOM解析)

    一:将内存中写好的xml文件读取到硬盘上 二:DOM方式对xml文件进行增删改查 1:添加节点(默认是在最后的子节点后面添加) @Test // 向元素中添加节点<version>1.0& ...

  6. javaweb学习总结(十一)——使用Cookie进行会话管理(转)

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  7. JavaWeb学习总结(转载)

    JavaWeb学习总结(五十三)--Web应用中使用JavaMail发送邮件      JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件     JavaWeb学习总结(五十 ...

  8. 转载-JavaWeb学习总结

    JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件 孤傲苍狼 2015-01-12 23:51 阅读:13407 评论:20     JavaWeb学习总结(五十二)——使用 ...

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

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

随机推荐

  1. 5.toogleButton以及Switch

    Switch现在用得更多,比toogleButton界面美观,用户体验也要好. 点击事件: 用isChecked来判断点击的是哪一个,然后做相对应的回应.

  2. Discuz! 6.x/7.x 全局变量防御绕过导致命令执行

    https://www.secpulse.com/archives/2338.html 模拟register_globals功能的代码,在GPC为off时会调用addslashes()函数处理变量值, ...

  3. Linux平台下线程池的原理及实现

    转自:http://blog.csdn.net/lmh12506/article/details/7753952 前段时间在github上开了个库,准备实现自己的线程池的,因为换工作的事,一直也没有实 ...

  4. js查找出现次数最多的字母

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  5. JavaScript的构造器与对象(二)

    constructor 的用法:对象的构造函数  每一个函数的Prototype属性指向的对象都包含唯一一个不可枚举属性constructor,该属性的值是这么一个对象:它指向了它所在的构造函数. 语 ...

  6. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  7. itoa

    功能:把int转为字符数组 eg: int a=100: char ch[3]; itoa(a,ch,10)://十进制 ---->ch[0]==1;...

  8. SqlSever基础 dateadd month 增加五个月

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  9. 【leetcode❤python】 9. Palindrome Number

    #回文数#Method1:将整数转置和原数比较,一样就是回文数:负数不是回文数#这里反转整数时不需要考虑溢出,但不代表如果是C/C++等语言也不需要考虑class Solution(object):  ...

  10. 【leetcode❤python】342. Power of Four

    #-*- coding: UTF-8 -*- class Solution(object):    def isPowerOfFour(self, num):        ""& ...