批处理,就是字面上的意思,一次性处理一批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数据库,只需几十秒便可完成。