批量插入数据操作
使用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); } } }
All that work will definitely pay off