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

坚持原创技术分享,您的支持将鼓励我继续创作!
0%