JavaWeb学习笔记(十五)—— 使用JDBC进行批处理
一、什么是批处理
批处理就是一批一批的处理,而不是一个一个的处理!
当你有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脚本创建表】
- create table testbatch
- (
- id int primary key,
- name varchar(20)
- );
【编写测试代码】
- /**
- * 使用Statement实现JDBC批处理操作
- */
- 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='zhangsan' where id=1";
- String sql6 = "insert into testbatch(id,name) values(5,'lisi')";
- String sql7 = "delete from testbatch where id=2";
- st = conn.createStatement();
- //添加要批量执行的SQL
- // st内部有个集合,用来装载sql语句
- st.addBatch(sql1);
- st.addBatch(sql2);
- st.addBatch(sql3);
- st.addBatch(sql4);
- st.addBatch(sql5);
- st.addBatch(sql6);
- st.addBatch(sql7);
- //执行批处理SQL语句,即一次把批中的所有sql语句发送给服务器
- st.executeBatch();
- //清除批处理命令
- st.clearBatch();
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- JdbcUtils.release(conn, st,rs);
- }
- }
- }
当执行了“批”之后,“批”中的SQL语句就会被清空!也就是说,连续两次调用executeBatch()相当于调用一次!因为第二次调用时,“批”中已经没有SQL语句了。
还可以在执行“批”之前,调用Statement的clearBatch()方法来清空“批”!
2.2 采用Statement.addBatch(sql)方式实现批处理的优缺点
优点:可以向数据库发送多条不同的SQL语句。
缺点:SQL语句没有预编译。当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。例如:
- Insert into user(name,password) values('aa','');
- Insert into user(name,password) values('bb','');
- Insert into user(name,password) values('cc','');
- Insert into user(name,password) values('dd','');
三、PreparedStatement批处理
PreparedStatement的批处理有所不同,因为每个PreparedStatement对象都绑定一条SQL模板。所以向PreparedStatement中添加的不是SQL语句,而是给“?”赋值。
3.1 使用PreparedStatement完成批处理范例
- /**
- * 使用prepareStatement实现JDBC批处理操作
- * pstmt对象内部有集合
- * 1.用循环疯狂向pstmt中添加sql参数,它自己有模板,使用一组参数与模板就可以匹配出一条sql语句
- * 2.调用它的执行批方法,完成向数据库发送
- */
- public class JdbcBatchHandleByPrepareStatement {
- @Test
- public void testJdbcBatchHandleByPrepareStatement() {
- Connection conn = null;
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- try {
- conn = JdbcUtils.getConnection();
- String sql = "insert into testbatch(id,name) values(?,?)";
- pstmt = conn.prepareStatement(sql);
- // 疯狂的添加参数
- for (int i = 0; i < 10000; i++) {
- pstmt.setInt(1, i + 1);
- pstmt.setString(2, "stu_" + i);
- // 添加批,这一组参数就保存到集合中了
- pstmt.addBatch();
- }
- long start = System.currentTimeMillis();
- // 执行批
- pstmt.executeBatch();
- long end = System.currentTimeMillis();
- System.out.println(end - start);
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- JdbcUtils.release(conn, pstmt, rs);
- }
- }
- }
3.2 采用PreparedStatement.addBatch()方式实现批处理的优缺点
优点:发送的是预编译后的SQL语句,执行效率高。
缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
注意:MySQL的批处理需要通过参数来打开:rewriteBatchedStatements=true
JavaWeb学习笔记(十五)—— 使用JDBC进行批处理的更多相关文章
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)
一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...
- (C/C++学习笔记) 十五. 构造数据类型
十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...
- JavaWeb学习总结(十一)--JDBC之批处理
一.批处理的介绍 在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.批处理只针对更新(增.删.改)语句,批 ...
- Javaweb学习笔记——(十七)——————JDBC的原理、四大核心类、四大参数、预编译、Dao模式、批处理、大数据、时间类型的转换
JDBC入门 *导入jar包:驱动 *加载驱动类:Class.forName("类名"); *给出url.username.password,其中url背下来 *使用DriverM ...
- MySQL学习笔记十五:优化(2)
一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...
- javaweb学习总结(十五)——JSP基础语法
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- javaweb学习总结十五(web开发的相关概念以及常用服务器介绍)
一:java web开发的相关概念 1:web分为静态web和动态web 2:模拟web服务器 web页面如果想让外部网络访问,必须通过网络程序读取资源,流程: a:用户通过浏览器访问网络程序 b:网 ...
- Java基础学习笔记十五 集合、迭代器、泛型
Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都 ...
- JavaWeb学习 (二十五)————监听器(Listener)
一.监听器介绍 1.1.监听器的概念
随机推荐
- Python获取服务器的厂商和型号信息-乾颐堂
Python获取服务器的厂商和型号信息,在RHEHL6下,需要系统预装python-dmidecode这个包(貌似默认就已经装过了) 脚本内容如下 [root@linuxidc tmp]# cat t ...
- Spring5源码解析-论Spring DispatcherServlet的生命周期
Spring Web框架架构的主要部分是DispatcherServlet.也就是本文中重点介绍的对象. 在本文的第一部分中,我们将看到基于Spring的DispatcherServlet的主要概念: ...
- HDU 6005 Pandaland (Dijkstra)
题意:给定一个图,找出一个最小环. 析:暴力枚举每一条,然后把边设置为最大值,以后就不用改回来了,然后跑一遍最短路,跑 n 次就好. 代码如下: #pragma comment(linker, &qu ...
- NetBeans找不到C/C++编译器
如果您已经安装 NetBeans IDE 6.9,但其中不包括 C/C++ 插件 如果在选择“文件”>“新建项目”时,NetBeans IDE 未显示 "C/C++" 项目类 ...
- ExecutorService的submit方法的坑
先看一段代码: public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerExcept ...
- Android adb 命令
一.概述 作为一名开发者,相信对adb指令一定不会陌生.那么在手机连接adb后,可通过am命令做很多操作: (1) 拨打电话10086 adb shell am start -a android.in ...
- 设计模式9---装饰模式(Decorator Pattern)
装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上一些责任.换言之,客户端 ...
- CodeForces 47E. Cannon(离线暴力+数学)
E. Cannon time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...
- yum使用,使用rpm指令安装rpm,使用dpkg指令安装deb
yum安装时如果报错提示安装失败,缺少库文件,可以使用: yum whatprovides 库名 之后安装提供的程序 yum remove xxx卸载 yum update 更新 解决 Require ...
- 【原创翻译】ArcGis Android 10.2.4更新内容简介
翻译不当和错误之处敬请指出 更新内容官方描述 https://developers.arcgis.com/android/guide/release-notes-10-2-4.htm 10.2.4的版 ...