使用PreparedStatement实现批量数据的操作(代码优化)

使用PreparedStatement实现批量数据的操作(代码优化)

package com.shan.blob;

import com.shan.util.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * 使用PreparedStatement实现批量数据的操作
 * update、delete本身就具有批量操作的效果
 *
 * 此时的批量操作,主要值得是批量插入
 *
 *
 * @author shan
 * @date 2021/5/17
 */
public class InsertTest {
    public static void main(String[] args) {
//        testInsert1();
//        testInsert2();
        testInsert3();
    }


    public static void testInsert1(){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            long start = System.currentTimeMillis();

            conn = JDBCUtils.getConnection();
            String sql = "insert into goods(name)values(?)";
            ps = conn.prepareStatement(sql);
            for(int i=0; i<=20000; i++){
                ps.setObject(1, "name_" + i);
                ps.execute();
            }
            long end = System.currentTimeMillis();
            System.out.println("花费的时间为:" + (end-start));
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps);
        }

    }

    //优化的批量插入操作二
    /**
    * 1.addBatch()、executeBatch()、clearBatch()
    * 2.mysql服务器是关闭批处理的,我们需要一个参数,让mysql开启批处理的支持。
    *       ?rewriteBatchedStatement=true 写在配置文件的url后面
    * 3.使用更新的驱动 mysql-connector-java-5.1.37-bin.jar
     * */

    public static void testInsert2(){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            long start = System.currentTimeMillis();

            conn = JDBCUtils.getConnection();
            String sql = "insert into goods(name)values(?)";
            ps = conn.prepareStatement(sql);
            for(int i=0; i<=20000; i++){
                ps.setObject(1, "name_" + i);

                //1. 攒 sql
                ps.addBatch();
                if(i%500 == 0){
                    //2.执行batch
                    ps.executeBatch();
                    //3.清空batch
                    ps.clearBatch();
                }


            }
            long end = System.currentTimeMillis();
            System.out.println("花费的时间为:" + (end-start));
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps);
        }


    }
    //优化的批量插入操作三
    /**
     * 设置连接不允许自动提交
     * */

    public static void testInsert3(){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            long start = System.currentTimeMillis();

            conn = JDBCUtils.getConnection();

            //设置不允许自动提交数据
            conn.setAutoCommit(false);

            String sql = "insert into goods(name)values(?)";
            ps = conn.prepareStatement(sql);
            for(int i=0; i<=20000; i++){
                ps.setObject(1, "name_" + i);

                //1. 攒 sql
                ps.addBatch();
                if(i%500 == 0){
                    //2.执行batch
                    ps.executeBatch();
                    //3.清空batch
                    ps.clearBatch();
                }


            }

            //提交数据
            conn.commit();

            long end = System.currentTimeMillis();
            System.out.println("花费的时间为:" + (end-start));
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps);
        }


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值