JDBC-批量处理数据(练习)

本文介绍了如何使用PreparedStatement进行批量插入,并对比了两种方式,包括传统的逐条执行和利用addBatch()和executeBatch()进行的高效批处理,特别提到了Mysql配置批处理的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package PreparedStatementCURD;
import Instrument.GetConnection;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @description 批量插入数据
 * @author Vodka
 * @date 2021/07//0:00
 */

/*
*
*   方式二:
* */

public class BatchDataProcessing {
    public static void main(String [] args){
         BatchInsertTwo();

    }

//    批量插入的方式一: 使用PreparedStatement
    public static void BatchInsertOne(){
        try {
            Connection conn =  GetConnection.getConnection();
            String sql = "Insert into Users (id, UName, UAge) values(?,?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);
            for (int index =0 ; index < 20000; ++index ){
                //先试用Statement语句测试
                ps.setObject(1,index+1);
                ps.setObject(2,"User"+index);
                ps.setObject(3,2*index);
                ps.execute();
            }


        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

//    批量插入的方式二:1. addBatch()   2.executeBatch()   3.clearBatch()  ,大大地提升了处理速度
//    Mysql是默认关闭数据批量处理的,需要在配置文件添加参数,让mysql支持批处理。 ?rewriteBatchedStatements=true,
//    写在配置文件的url后面
    public static void BatchInsertTwo(){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = GetConnection.getConnection();
            //记录插入开始的时间
            long StartTime =  System.currentTimeMillis();
            //设置不允许自动提交数据 。 数据库的DML操作设置是默认提交,这样就不能数据出错时回滚了
            conn.setAutoCommit(false);
             String sql = "Insert into Users (id,UName,UAge) values(?,?,?)";
            ps = conn.prepareStatement(sql);
            int temp = 0;   //用来标记累积sql语句的多少
             for(int index = 100001 ; index < 1000000; ++index){
                 ps.setObject(1,index );
                 ps.setObject(2,"User"+index);
                 ps.setObject(3,index*2);

                 //1.累积SQL
                 ps.addBatch();
                 temp++;
                 //2.假设累积到500条,就执行批量插入
                 if(temp % 500 == 0){
                     ps.executeBatch();
                     temp = 0;
                 }
                 //3.清空上一批累积的Batch
                 ps.clearBatch();
             }
             //记录插入完成后的时间
            long EndTime = System.currentTimeMillis();
             System.out.println("批量插入数据所用的时间:"+ (EndTime - StartTime) +"ms");


        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值