create table T_ZST(
id int(4) NOT NULL AUTO_INCREMENT UNIQUE,
product_name varchar(50) NOT NULL,
product_type varchar(50) NOT NULL,
product_country varchar(50) NOT NULL,
product_minimum_price varchar(50),
product_maximum_price varchar(50),
product_staple_price varchar(50),
product_info_from varchar(50) NOT NULL,
product_business_time varchar(50)
);
以下为引用的内容: 数据库SQL文件: /*source F:/mysqlTest/mysqlInsertTest/src/db.sql*/ drop database if exists testInsert; create database testInsert; use testInsert; drop table if exists insertTB; create table insertTB(id int primary key, username varchar(20)); 数据库属性: package com.ys.db.init; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public abstract class DBProperty { private static String FILE_NAME = "db.properties"; static { InputStream in = DBProperty.class.getResourceAsStream(FILE_NAME); Properties p = new Properties(); try { p.load(in); driverClass = p.getProperty("driverClass"); url = p.getProperty("url"); username = p.getProperty("username"); password = p.getProperty("password"); } catch (IOException e) { e.printStackTrace(); } } public static String driverClass = "com.mysql.jdbc.Driver"; public static String url = "jdbc:mysql://localhost:3306/testInsert"; public static String username = "root"; public static String password = "wq3892961"; } driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/testInsert username=root password=wq3892961 数据源: package com.ys.db.init; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import com.ys.db.init.DBProperty; public class DataSource { protected DataSource() { try { System.out.println("driverClass:" + DBProperty.driverClass); Class.forName(DBProperty.driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public Connection getConnection() { try { System.out.println("url:" + DBProperty.url); System.out.println("username:" + DBProperty.username); System.out.println("password:" + DBProperty.password); return DriverManager.getConnection(DBProperty.url, DBProperty.username, DBProperty.password); } catch (SQLException e) { e.printStackTrace(); return null; } } }
普通的每条插入:
package com.ys.db.init; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class TestInsert1 { public static void main(String[] args) { DataSource d = new DataSource(); Connection connection = d.getConnection(); try { Statement createStatement = connection.createStatement(); long start = System.currentTimeMillis(); for (long i = 0; i < 100000; i++) { createStatement.execute("insert into insertTB values(" + i + ", 'username')"); } long end = System.currentTimeMillis(); System.out.println((end - start) / 1000); createStatement.close(); connection.close(); // 123秒 } catch (SQLException e) { e.printStackTrace(); } } } 消耗了123秒
LOAD DATA指令:
首先需要生成数据文件,要100000条,作为程序员的我们怎么可以是复制呢?自己编写呗!
package com.ys.db.init; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class GInert { public static void main(String args[]) { try { File f = new File("./src/i.sql"); if (!f.exists()) { f.createNewFile(); } FileOutputStream out = new FileOutputStream(f, true); for (long i = 0; i < 100000; i++) { out .write((i + "\tusername\r\n") .getBytes()); } out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 测试类: package com.ys.db.init; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class TestInsert2 { public static void main(String[] args) { DataSource d = new DataSource(); Connection connection = d.getConnection(); Statement createStatement = null; try { createStatement = connection.createStatement(); String sql = "Load Data InFile 'F:/mysqlTest/mysqlInsertTest/src/i.sql' Into Table `insertTB`"; long start = System.currentTimeMillis(); createStatement.execute(sql); long end = System.currentTimeMillis(); System.out.println((end - start) / 1000); createStatement.close(); connection.close(); // 0秒 } catch (SQLException e) { e.printStackTrace(); } } } 仅仅需要0秒! 存储过程: 新建存储过程 delimiter // CREATE PROCEDURE idata() BEGIN DECLARE a INT; SET a = 1; WHILE a < 100000 DO INSERT INTO insertTB VALUES(a, 'username'); SET a = a + 1; END WHILE; END;// 测试类: package com.ys.db.init; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class TestInsert3 { public static void main(String[] args) { DataSource d = new DataSource(); Connection connection = d.getConnection(); Statement createStatement = null; try { createStatement = connection.createStatement(); String sql = "call idata();//"; long start = System.currentTimeMillis(); createStatement.execute(sql); long end = System.currentTimeMillis(); System.out.println((end - start) / 1000); createStatement.close(); connection.close(); // } catch (SQLException e) { e.printStackTrace(); } } }
也只是使用了0秒
从上可知道,存储过程和LOAD DATA都会比单条语句的插入快的多!
和 Load Data InFile 相反的是
Select * From `TableTest` Into OutFile 'C:/Data_OutFile.txt';
注意一点,要生成文本文件的时候,字段之间有一个制表符\t,例如,
"\t6\t5\t1\t1.8\t1.8\t1.8\t7\t9\r\n"