一、什么是批处理

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

  当你有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进行批处理的更多相关文章

  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. 在Qt中使用SQLite数据库

    前言 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统. Qt5以上版本可以直接使用SQLite(Qt自带驱动). 用法 1 准备 引入 ...

  2. java读取properties配置文件[转]

    网上文章常见的几种读取.properties文件的方式 1.使用java.util.Properties类的load()方法 示例: InputStream in = lnew BufferedInp ...

  3. ADT

    1.什么是antant是构建工具2.什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3.ant的好处跨平台   --因为 ...

  4. [GO]goexit的使用

    package main import "fmt" func test() { defer fmt.Println("cccccccccccc")//在函数退出 ...

  5. [GO]使用map生成 json

    package main import ( "encoding/json" "fmt" ) func main() { m := make(map[) //因为 ...

  6. Yii2 中国省市区三级联动

    1.获取源码:https://github.com/chenkby/yii2-region 2.安装 添加到你的composer.json文件 "chenkby/yii2-region&qu ...

  7. javascript总结25:Array的5中迭代方法: every(), filter() , forEach() map() some()

    1 Array常用的操作方法: 1 操作方法 - concat() //把参数拼接到当前数组 -slice() //从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开 ...

  8. KindEditor3.x整合教程-Xproer.WordPaster

    版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...

  9. WordPaster2-Chrome 45安装说明

    下载地址:http://www.ncmem.com/download/WordPaster2/WordPaster.exe 安装方法:   运行WordPaster.exe进行安装,WordPaste ...

  10. Eclipse快捷键和练习题(倒叙,排序)

    1    快捷键 内容辅助键  Alt+/ 自动补齐main方法  main 然后 Alt+/ 自动补齐输出语句  syso 然后 Alt+/ 格式化Ctrl+Shift+f 代码区域右键 -- So ...