一.JDBC批量操作+事務提交
package com.sb.test; import java.sql.*; import java.util.Random; /** * 批量操作+事務提交 **/ public class JdbcInsertDataLess { private static String url = "jdbc:mysql://localhost:3306/TEST?characterEncoding=utf8&serverTimezone=GMT%2B8"; private static String user = "root"; private static String password = "root"; public static void main(String[] args) { Connection conn = null; PreparedStatement pstm = null; ResultSet rt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); String sql = "INSERT INTO person(pid,name) VALUES(?,CONCAT('姓名',?))"; pstm = conn.prepareStatement(sql); conn.setAutoCommit(false); Long startTime = System.currentTimeMillis(); Random rand = new Random(); int a, b; //插入100000條數據 for (int i = 1; i <= 100000; i++) { pstm.setInt(1, i); pstm.setInt(2, i); //隨機數 a = rand.nextInt(10); b = rand.nextInt(10); pstm.setString(1, "188" + a + "88" + b); pstm.addBatch(); } pstm.executeBatch(); conn.commit(); Long endTime = System.currentTimeMillis(); System.out.println("************************正在插入中,請稍等******************************"); System.out.println("批量插入用時:" + (endTime - startTime)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } finally { if (pstm != null) { try { pstm.close(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } } } }
二.存儲過程批量插入
DROP PROCEDURE IF EXISTS proc_initData;-- 如果存在此存儲過程則刪掉 DELIMITER $ CREATE PROCEDURE proc_initData() BEGIN DECLARE i INT DEFAULT 1; WHILE i<=100000 DO INSERT INTO person VALUES(i,CONCAT('姓名',i)); SET i = i+1; END WHILE; END $ CALL proc_initData();
三.使用UNION ALL來進行插入操作
INSERT INTO person(pid,NAME) SELECT 4,'000' UNION ALL SELECT 5,'001' UNION ALL SELECT 6,'002' 1、INSERT INTO person(pid, name) VALUES(11, val12), (21, val22), (31,val32) ; 2、INSERT INTO person(pid, name) SELECT 333, val12 UNION ALL SELECT 33333, val22 union all select 444, val32 ; 這樣的寫法是屬於復合SQL語句,表示先把兩個SELECT的結果集進行無刪減的聯合,再把聯合結果插入到TABLE中。
四.腳本插入數據
insert.sql
INSERT INTO person(pid, name) SELECT 777,'val12' UNION ALL SELECT 88888888,'val22' union all select 88888, 'val32' ;
insertbatch.bat
#!/bin/bash p="/tmp" //目錄下全是sql文件 dbUser='root' dbPassword='root' dbName='hengda' cd $p; for f in `ls $p/*.sql` do echo $f; mysql -u $dbUser -p$dbPassword -f $dbName -e "source $f"; mv $f $f.done; done echo 'finished!'
reradme.md
/tmp" ://目錄下全是sql文件