jdbc基础 (四) 批处理

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

直接看例子吧:

  1 package com.cream.ice.jdbc;
  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 /**
 11  * 
 12  * 假设已经存在表test: 
 13  * create table test( 
 14  *         id int primary key,
 15  *         name varchar(20) 
 16  * );
 17  * 
 18  * @author ice
 19  *
 20  */
 21 
 22 public class Batch {
 23     private Connection connection;
 24     private Statement statement;
 25     private PreparedStatement preStatement;
 26     private ResultSet resultSet;
 27 
 28     /**
 29      * 向ttest中插入2条记录,删除掉第1条
 30      * 由于批处理的多条语句不同,所以使用Statement进行批处理
 31      */
 32     @Test
 33     public void testBatch1() {
 34         try {
 35             connection = JdbcUtils.getConnection();
 36             statement = connection.createStatement();
 37 
 38             String sql1 = "insert into test (id,name) values(1,'Tom')";
 39             String sql2 = "insert into test (id,name) values(2,'Jack')";
 40             String sql3 = "delete from test where id=1";
 41 
 42             // 内部维护了一个List,将sql语句加到List中
 43             statement.addBatch(sql1);
 44             statement.addBatch(sql2);
 45             statement.addBatch(sql3);
 46 
 47             // 执行批处理
 48             int num[] = statement.executeBatch();
 49 
 50             // i为每条语句影响到的行数
 51             for (int i : num)
 52                 System.out.print(i + " ");
 53 
 54         } catch (Exception e) {
 55             e.printStackTrace();
 56         } finally {
 57             JdbcUtils.releaseResources(null, statement, connection);
 58         }
 59     }
 60 
 61     /**
 62      * 向test中插入100条记录
 63      * 由于语句完全相同,只是参数不同,使用PreparedStatement
 64      */
 65     @Test
 66     public void testBatch2() {
 67         try {
 68             connection = JdbcUtils.getConnection();
 69 
 70             String sql = "insert into test (id,name) values(?,?)";
 71 
 72             preStatement = connection.prepareStatement(sql);
 73 
 74             // 要插入100条记录
 75             for (int i = 0; i < 100; i++) {
 76                 preStatement.setInt(1, i + 1);
 77                 preStatement.setString(2, "No." + (i + 1));
 78                 preStatement.addBatch();
 79             }
 80 
 81             // 执行批处理语句
 82             preStatement.executeBatch();
 83             
 84             statement=connection.createStatement();
 85             resultSet=statement.executeQuery("select * from test");
 86             
 87             //将插入记录打印到控制台上
 88             while(resultSet.next()){
 89                 System.out.print("id:"+resultSet.getInt("id")+" ");
 90                 System.out.println("name:"+resultSet.getString("name"));
 91             }
 92             
 93         } catch (Exception e) {
 94             e.printStackTrace();
 95         } finally {
 96             JdbcUtils.releaseResources(null, preStatement, connection);
 97             JdbcUtils.releaseResources(resultSet, statement, connection);
 98         }
 99     }
100 }

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java编程技术

Mysql中使用流式查询避免数据量过大导致OOM-后续

之前http://www.jianshu.com/p/0339c6fe8b61 介绍了MySQL中三种使用流式方法,看起来很优雅,实则优雅的同时还是有一些注意事...

94510
来自专栏个人分享

Hive metastore源码阅读(三)

  上次写了hive metastore的partition的生命周期,但是简略概括了下alter_partition的操作,这里补一下alter_partit...

30920
来自专栏Hongten

spring+hibernate+struts2+compass整合

http://www.cnblogs.com/hongten/gallery/image/113449.html

13140
来自专栏GreenLeaves

SQL学习之使用常用函数处理数据

一、在介绍使用函数处理数据前,先说下使用DBMS(数据库管理系统)处理数据所带来的问题! 1、与几乎所有的DBMS都同等的支持SQL语句(如SELECT)不同,...

20050
来自专栏salesforce零基础学习

salesforce 零基础学习(三十九) soql函数以及常量

在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,...

62800
来自专栏Python

Django——model基础

ORM 映射关系:     表名 <-------> 类名 字段 <-------> 属性     表记录 <------->类实例对象...

198100
来自专栏不想当开发的产品不是好测试

java 执行sql文件

# 背景 用例执行完毕,期望回滚数据,因此希望执行sql来回滚数据 # 步骤 直接show代码,借助的是mybatis的ScriptRunner /** ...

50280
来自专栏Java成神之路

HQL语句大全

Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它...

21250
来自专栏青玉伏案

Oracle常用函数

前一段时间学习Oracle 时做的学习笔记,整理了一下,下面是分享的Oracle常用函数的部分笔记,以后还会分享其他部分的笔记,请大家批评指正。 1.Oracl...

22190
来自专栏MasiMaro 的技术博文

OLEDB 静态绑定和数据转化接口

OLEDB 提供了静态绑定和动态绑定两种方式,相比动态绑定来说,静态绑定在使用上更加简单,而在灵活性上不如动态绑定,动态绑定在前面已经介绍过了,本文主要介绍OL...

12610

扫码关注云+社区

领取腾讯云代金券