批处理,就是字面上的意思,一次性处理一批sql语句。

直接看例子吧:

 package com.cream.ice.jdbc;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement; import org.junit.Test; /**
*
* 假设已经存在表test:
* create table test(
* id int primary key,
* name varchar(20)
* );
*
* @author ice
*
*/ public class Batch {
private Connection connection;
private Statement statement;
private PreparedStatement preStatement;
private ResultSet resultSet; /**
* 向ttest中插入2条记录,删除掉第1条
* 由于批处理的多条语句不同,所以使用Statement进行批处理
*/
@Test
public void testBatch1() {
try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement(); String sql1 = "insert into test (id,name) values(1,'Tom')";
String sql2 = "insert into test (id,name) values(2,'Jack')";
String sql3 = "delete from test where id=1"; // 内部维护了一个List,将sql语句加到List中
statement.addBatch(sql1);
statement.addBatch(sql2);
statement.addBatch(sql3); // 执行批处理
int num[] = statement.executeBatch(); // i为每条语句影响到的行数
for (int i : num)
System.out.print(i + " "); } catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.releaseResources(null, statement, connection);
}
} /**
* 向test中插入100条记录
* 由于语句完全相同,只是参数不同,使用PreparedStatement
*/
@Test
public void testBatch2() {
try {
connection = JdbcUtils.getConnection(); String sql = "insert into test (id,name) values(?,?)"; preStatement = connection.prepareStatement(sql); // 要插入100条记录
for (int i = 0; i < 100; i++) {
preStatement.setInt(1, i + 1);
preStatement.setString(2, "No." + (i + 1));
preStatement.addBatch();
} // 执行批处理语句
preStatement.executeBatch(); statement=connection.createStatement();
resultSet=statement.executeQuery("select * from test"); //将插入记录打印到控制台上
while(resultSet.next()){
System.out.print("id:"+resultSet.getInt("id")+" ");
System.out.println("name:"+resultSet.getString("name"));
} } catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.releaseResources(null, preStatement, connection);
JdbcUtils.releaseResources(resultSet, statement, connection);
}
}
}

代码里使用了工具类JdbcUtils,可参阅jdbc基础 (二) 通过properties配置文件连接数据库中的实现。

第一个例子中由于批处理的多条语句不同,所以使用Statement进行批处理。

第二个例子中由于语句完全相同,只是参数不同,使用PreparedStatement来处理。

这里值得注意的是,在第二个例子中,如果批处理语句数量不是100,而是达到几十万或上百万条,则在mysql中是极为耗时的,需要若干小时才可处理完,但如果换成oracle数据库,只需几十秒便可完成。

jdbc基础 (四) 批处理的更多相关文章

  1. JDBC 基础知识总结

    1.  何谓JDBC  --- Java Database Connectivity. 由Sun 公司提供的访问数据库的一组java类和接口,用来对数据库进行链接.发送SQL语句.处理返回结果,为开发 ...

  2. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

  3. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  4. Bootstrap<基础四> 代码

    Bootstrap 允许您以两种方式显示代码: 第一种是 <code> 标签.如果您想要内联显示代码,那么您应该使用 <code> 标签. 第二种是 <pre> 标 ...

  5. jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

    一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数 ...

  6. jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...

  7. jdbc基础 (二) 通过properties配置文件连接数据库

    csdn博文地址:jdbc基础 (二) 通过properties配置文件连接数据库 上一篇描述了对mysql数据库的简单操作,下面来看一下开发中应该如何灵活应用. 因为jdbc对数据库的驱动加载.连接 ...

  8. JDBC基础教程

    本文实例讲述了JDBC基础知识与技巧.分享给大家供大家参考.具体分析如下: 1.什么是JDBC? 通俗来讲JDBC技术就是通过java程序来发送SQL语句到数据库,数据库收到SQL语句后执行,把结果返 ...

  9. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

随机推荐

  1. Sublime Text 2 (for OS X )配置成可以运行基于python3解释器的 .py文件

    Mac自带的python 其version是python 2.7 官网下的Sublime Text 2部署好了以后默认也是 为了使ST2 可以在command+B时可以运行基于python3的.py, ...

  2. MSBI--enlarge the DW database table volume

    我们在学习MSBI的时候,经常会使用官方提供的Adventureworks和AdventureworksDW示例数据库,但是官方提供的数据量有点小, 以DW为例,Factinternetsales只有 ...

  3. ORA-01034: ORACLE not available如何解决

    一个小小的问题,让我折腾了一个上午,下午三点彻底解决了,分享一个给大家解决方法,尽管在测试服务器上,但是经验是值得总结和分享的. ERROR:ORA-01034: ORACLE not availab ...

  4. 【实践】jdbc批量插入数据

    参考文献:http://my.oschina.net/u/1452675/blog/203670 http://superjavason.iteye.com/blog/255423 /*测试批量写入数 ...

  5. Codeforces Round #253 Div2 D.Andrey and Problem 概率+贪心

    概率计算:P(某set) =  令:  和   现在考虑: 1.考虑某个集合,再加一个概率为Pi的朋友后能不能使总概率提高. 即: 由公式可知, 如果 S < 1,则delta > 0,则 ...

  6. 第20章 DLL高级技术(3)

    20.4 函数转发器 (1)函数转发器原理(下图是利用Dependency Walker打开Kernel32.dll得到) ①图中CloseThreadpool*等4个函数转发到NTDLL中相应的函数 ...

  7. 第16章 Windows线程栈

    16.1 线程栈及工作原理 (1)线程栈简介 ①系统在创建线程时,会为线程预订一块地址空间(即每个线程私有的栈空间),并调拨一些物理存储器.默认情况下,预订1MB的地址空间并调拨两个页面的存储器. ② ...

  8. Android中Intent传递对象的两种方法(Serializable,Parcelable)

    今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...

  9. xcode的菜单栏功能解析

    [Xcode 7.2]Xcode菜单栏之你不知道的那点事 File: New : 可以新建tap,窗口,新文件,playground,workspace,target等等. Add Files to ...

  10. GitLab/Git在AndroidStudio上的使用(转)

    1.在AndroidStudio上的配置GitLab 1)首先先将gitlab上的开发项目clone到本地(可以使用命令行或者管理工具,具体操作在GitLab中已经涉及,这里不再赘述),然后导入到An ...