jdbc基础 (四) 批处理

批处理,就是字面上的意思,一次性处理一批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基础 (四) 批处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值