批量插入数据操作

 使用PreparedStatement实现批量数据操作
 此时的批量操作,主要指的是批量插入。
 使用PreparedStatement如何实现更高效的批量插入

CREATE TABLE goods(
                 id INT PRIMARY KEY AUTO_INCREMENT,
                 NAME VARCHAR(25)
);

PreparedStatementBatch

package com.aff.PreparedStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.Test;
import com.aff.utils.JDBCUtils;

/*
 * 使用PreparedStatement实现批量数据操作
 * 此时的批量操作,主要指的是批量插入。
 * 使用PreparedStatement如何实现更高效的批量插入
 * 
 * CREATE TABLE goods(
         id INT PRIMARY KEY AUTO_INCREMENT,
         NAME VARCHAR(25)
);
 */
public class PreparedStatementBatch {
    // 插入方式一:使用Statement 效率慢,而且有sql注入问题, 直接舍弃

    // 插入方式二:使用PreparedStatement
    @Test
    public void testInsert() {
        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 = 1; i <= 10000; i++) {
                // 填充占位符,填上
                ps.setObject(1, "name_" + i);
                ps.execute();// 执行
            }
            long end = System.currentTimeMillis();
            System.out.println("花费时间:" + (end - start));//插入一万条数据花费时间:347702
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(conn, ps);
        }
    }

    
    
    // 批量插入的方式三:
    //                 1. ①addBatch()   ②executeBatch()   ③clearBatch()
    //                 2. mysql服务器默认是关闭处理的,我们需要通过一个参数,让mysql开启批处理的支持
    //                     url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
    //                 3. 使用更新的mysql驱动:mysql-connector-java-5.1.37-bin.jar
    @Test
    public void testBatch() {
        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 = 1; i <= 1000000; 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));
//插入一万条数据花费时间:347702-->2777 //数据改成一百万,花费时间:95374 } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps); } } // 批量插入的方式四:最终版 @Test public void testBatch2() { 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 = 1; i <= 1000000; 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)); //数据改成一百万,花费时间:95374--->花费时间:9790 } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps); } } }

 

posted @ 2020-04-11 11:37  林淼零  阅读(454)  评论(0编辑  收藏  举报