一、什么是批处理

  批处理就是一批一批的处理,而不是一个一个的处理!

  当你有10条SQL语句要执行时,一次向服务器发送一条SQL语句,这么做效率上很差!处理的方案是使用批处理,即一次向服务器发送多条SQL语句,然后由服务器一次性处理。

  批处理只针对更新(增、删、改)语句,批处理没有查询什么事儿!

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

二、Statement批处理

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

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

2.1 使用Statement完成批处理范例

【编写测试的SQL脚本创建表】

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

【编写测试代码】

  1. /**
  2. * 使用Statement实现JDBC批处理操作
  3. */
  4. public class JdbcBatchHandleByStatement {
  5. @Test
  6. public void testJdbcBatchHandleByStatement() {
  7. Connection conn = null;
  8. Statement st = null;
  9. ResultSet rs = null;
  10. try {
  11. conn = JdbcUtils.getConnection();
  12. String sql1 = "insert into testbatch(id,name) values(1,'aaa')";
  13. String sql2 = "insert into testbatch(id,name) values(2,'bbb')";
  14. String sql3 = "insert into testbatch(id,name) values(3,'CCC')";
  15. String sql4 = "insert into testbatch(id,name) values(4,'DDD')";
  16. String sql5 = "update testbatch set name='zhangsan' where id=1";
  17. String sql6 = "insert into testbatch(id,name) values(5,'lisi')";
  18. String sql7 = "delete from testbatch where id=2";
  19. st = conn.createStatement();
  20. //添加要批量执行的SQL
  21. // st内部有个集合,用来装载sql语句
  22. st.addBatch(sql1);
  23. st.addBatch(sql2);
  24. st.addBatch(sql3);
  25. st.addBatch(sql4);
  26. st.addBatch(sql5);
  27. st.addBatch(sql6);
  28. st.addBatch(sql7);
  29. //执行批处理SQL语句,即一次把批中的所有sql语句发送给服务器
  30. st.executeBatch();
  31. //清除批处理命令
  32. st.clearBatch();
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }finally {
  36. JdbcUtils.release(conn, st,rs);
  37. }
  38. }
  39. }

  当执行了“批”之后,“批”中的SQL语句就会被清空!也就是说,连续两次调用executeBatch()相当于调用一次!因为第二次调用时,“批”中已经没有SQL语句了。

  还可以在执行“批”之前,调用Statement的clearBatch()方法来清空“批”!

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

  优点:可以向数据库发送多条不同的SQL语句。
  缺点:SQL语句没有预编译。当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。例如:

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

三、PreparedStatement批处理

  PreparedStatement的批处理有所不同,因为每个PreparedStatement对象都绑定一条SQL模板。所以向PreparedStatement中添加的不是SQL语句,而是给“?”赋值。

3.1 使用PreparedStatement完成批处理范例

  1. /**
  2. * 使用prepareStatement实现JDBC批处理操作
  3. * pstmt对象内部有集合
  4. * 1.用循环疯狂向pstmt中添加sql参数,它自己有模板,使用一组参数与模板就可以匹配出一条sql语句
  5. * 2.调用它的执行批方法,完成向数据库发送
  6. */
  7. public class JdbcBatchHandleByPrepareStatement {
  8. @Test
  9. public void testJdbcBatchHandleByPrepareStatement() {
  10. Connection conn = null;
  11. PreparedStatement pstmt = null;
  12. ResultSet rs = null;
  13. try {
  14. conn = JdbcUtils.getConnection();
  15. String sql = "insert into testbatch(id,name) values(?,?)";
  16. pstmt = conn.prepareStatement(sql);
  17.  
  18. // 疯狂的添加参数
  19. for (int i = 0; i < 10000; i++) {
  20. pstmt.setInt(1, i + 1);
  21. pstmt.setString(2, "stu_" + i);
  22.  
  23. // 添加批,这一组参数就保存到集合中了
  24. pstmt.addBatch();
  25. }
  26. long start = System.currentTimeMillis();
  27. // 执行批
  28. pstmt.executeBatch();
  29. long end = System.currentTimeMillis();
  30.  
  31. System.out.println(end - start);
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }finally {
  35. JdbcUtils.release(conn, pstmt, rs);
  36. }
  37. }
  38. }

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

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

  注意:MySQL的批处理需要通过参数来打开:rewriteBatchedStatements=true

  

JavaWeb学习笔记(十五)—— 使用JDBC进行批处理的更多相关文章

  1. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)

    一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...

  3. (C/C++学习笔记) 十五. 构造数据类型

    十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...

  4. JavaWeb学习总结(十一)--JDBC之批处理

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

  5. Javaweb学习笔记——(十七)——————JDBC的原理、四大核心类、四大参数、预编译、Dao模式、批处理、大数据、时间类型的转换

    JDBC入门 *导入jar包:驱动 *加载驱动类:Class.forName("类名"); *给出url.username.password,其中url背下来 *使用DriverM ...

  6. MySQL学习笔记十五:优化(2)

    一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...

  7. javaweb学习总结(十五)——JSP基础语法

    任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...

  8. javaweb学习总结十五(web开发的相关概念以及常用服务器介绍)

    一:java web开发的相关概念 1:web分为静态web和动态web 2:模拟web服务器 web页面如果想让外部网络访问,必须通过网络程序读取资源,流程: a:用户通过浏览器访问网络程序 b:网 ...

  9. Java基础学习笔记十五 集合、迭代器、泛型

    Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都 ...

  10. JavaWeb学习 (二十五)————监听器(Listener)

    一.监听器介绍 1.1.监听器的概念

随机推荐

  1. Python获取服务器的厂商和型号信息-乾颐堂

    Python获取服务器的厂商和型号信息,在RHEHL6下,需要系统预装python-dmidecode这个包(貌似默认就已经装过了) 脚本内容如下 [root@linuxidc tmp]# cat t ...

  2. Spring5源码解析-论Spring DispatcherServlet的生命周期

    Spring Web框架架构的主要部分是DispatcherServlet.也就是本文中重点介绍的对象. 在本文的第一部分中,我们将看到基于Spring的DispatcherServlet的主要概念: ...

  3. HDU 6005 Pandaland (Dijkstra)

    题意:给定一个图,找出一个最小环. 析:暴力枚举每一条,然后把边设置为最大值,以后就不用改回来了,然后跑一遍最短路,跑 n 次就好. 代码如下: #pragma comment(linker, &qu ...

  4. NetBeans找不到C/C++编译器

    如果您已经安装 NetBeans IDE 6.9,但其中不包括 C/C++ 插件 如果在选择“文件”>“新建项目”时,NetBeans IDE 未显示 "C/C++" 项目类 ...

  5. ExecutorService的submit方法的坑

    先看一段代码: public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerExcept ...

  6. Android adb 命令

    一.概述 作为一名开发者,相信对adb指令一定不会陌生.那么在手机连接adb后,可通过am命令做很多操作: (1) 拨打电话10086 adb shell am start -a android.in ...

  7. 设计模式9---装饰模式(Decorator Pattern)

    装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上一些责任.换言之,客户端 ...

  8. CodeForces 47E. Cannon(离线暴力+数学)

    E. Cannon time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...

  9. yum使用,使用rpm指令安装rpm,使用dpkg指令安装deb

    yum安装时如果报错提示安装失败,缺少库文件,可以使用: yum whatprovides 库名 之后安装提供的程序 yum remove xxx卸载 yum update 更新 解决 Require ...

  10. 【原创翻译】ArcGis Android 10.2.4更新内容简介

    翻译不当和错误之处敬请指出 更新内容官方描述 https://developers.arcgis.com/android/guide/release-notes-10-2-4.htm 10.2.4的版 ...