zoukankan      html  css  js  c++  java
  • 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数据库,只需几十秒便可完成。

  • 相关阅读:
    云风版协程库源代码分析
    取消勾选use androidx.* artifacts
    Linux编程之信号
    Linux编程之错误代码
    git身份验证失败清除密码缓存
    实现可执行的so动态链接库
    同步以及异步connect
    STM32系列芯片命名规范
    QtAV的编译方法
    汇编文件后缀 .s 与 .S
  • 原文地址:https://www.cnblogs.com/z941030/p/4552907.html
Copyright © 2011-2022 走看看