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基础 (四) 批处理

你可能感兴趣的:(java,mysql,jdbc,batch,批处理)