批量插入数据

1. 三种方法的介绍(互为迭代升级的关系)

/**
 *      1. 直接for循环多次插入
 *
 *      2. 在(1)的基础上,开启sql的批量处理,利用Batch机制,先将多个sql语句存起来,然后一起执行这些sql语句
 *          2.1 有三个方法addBatch()、executeBatch()、clearBatch()
 *          2.2 mysql服务器默认是关闭批量处理的
 *              解决方法:
 * 	                a. 通过一个参数,开启mysql对批量处理的支持【?rewriteBatchedStatements=true】
 *   	   	            写在 url 后面
 * 	                b. 使用较新的mysql驱动:mysql-connector-java-5.1.37-bin.jar
 *
 *      3. 在(2)的基础上,设置不允许自动提交,等到所有的sql都执行完了,再提交数据
 */

2. 代码演示

// 在下面的代码中

Connection conn = Utils_01.getConnection(); // 这是获取Connection的连接对象

Utils_01.closeResource(conn, ps); // 这是关闭Connection的资源

(1) 利用for循环批量插入

@Test
    public void insert1() throws Exception {

        int cnt = 200000;

        long start = new Date().getTime();

        // 1. 获取连接
        Connection conn = Utils_01.getConnection();

        // 2. 预编译
        String sql = "insert into goods (name) values (?)";
        PreparedStatement ps = conn.prepareStatement(sql);

        // 3. 插入数据
        for (int i = 1; i <= cnt; i ++ ) {
            ps.setObject(1, "name_" + i);
            ps.execute();
        }

        // 4. 关闭资源
        Utils_01.closeResource(conn, ps);


        long end = new Date().getTime();
        System.out.println(end - start);
    }

(2) 开启MySQL的批量插入

@Test
    public void insert2() throws Exception {
        int cnt = 2000000;

        long start = new Date().getTime();

        // 1. 获取连接
        Connection conn = Utils_01.getConnection();

        // 2. 预编译
        String sql = "insert into goods (name) values (?)";
        PreparedStatement ps = conn.prepareStatement(sql);

        // 3. 插入数据
        for (int i = 1; i <= cnt; i ++ ) {
            ps.setObject(1, "name_" + i);
            // 3.1 攒sql语句
            ps.addBatch();
            // 3.2 到达一定的量时,执行sql语句,并将赞的sql清空;而且,为了防止遗漏,到达最后一个时,也要执行
            if (i % 500 == 0 || i == cnt) {
                ps.executeBatch();
                ps.clearBatch();
            }
        }

        // 4. 关闭资源
        Utils_01.closeResource(conn, ps);


        long end = new Date().getTime();
        System.out.println(end - start);
    }

(3) 取消自动提交

    @Test
    public void insert_3() throws Exception {
        int cnt = 2000000;

        long start = new Date().getTime();

        // 1. 获取连接
        Connection conn = Utils_01.getConnection();
        conn.setAutoCommit(false); // 同时设置不可自动提交

        // 2. 预编译
        String sql = "insert into goods (name) values (?)";
        PreparedStatement ps = conn.prepareStatement(sql);

        // 3. 插入数据
        for (int i = 1; i <= cnt; i ++ ) {
            ps.setObject(1, "name_" + i);
            // 3.1 攒sql语句
            ps.addBatch();
            // 3.2 到达一定的量时,执行sql语句,并将赞的sql清空;而且,为了防止遗漏,到达最后一个时,也要执行
            if (i % 500 == 0 || i == cnt) {
                ps.executeBatch();
                ps.clearBatch();
            }
        }

        // 4. 关闭资源
        conn.commit(); // 关闭资源的之前,手动提交数据
        Utils_01.closeResource(conn, ps);


        long end = new Date().getTime();
        System.out.println(end - start);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值