快速批量插入setLocalInfileInputStream的用法
Thanks for jeff ricks help!
Here is the article url:
import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; import org.apache.commons.io.IOUtils; import java.io.InputStream; import java.lang.reflect.Method; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; public class DemoBulkInsert { public void bulkInsert(Connection conn, Long personId, HashMap<String, String> hashOfNameValues) throws SQLException { // First create a statement off the connection and turn off unique checks and key creation Statement statement = (com.mysql.jdbc.Statement)conn.createStatement(); statement.execute("SET UNIQUE_CHECKS=0; "); statement.execute("ALTER TABLE real_big_table DISABLE KEYS"); // Define the query we are going to execute String statementText = "LOAD DATA LOCAL INFILE file.txt " + "INTO TABLE real_big_table " + "(name, value) " + " SET owner_id = " + personId + ", " + " version = 0; "; // Create StringBuilder to String that will become stream StringBuilder builder = new StringBuilder(); // Iterate over map and create tab-text string for (Map.Entry<String, String> entry : hashOfNameValues.entrySet()) { builder.append(entry.getKey()); builder.append( ); builder.append(entry.getValue()); builder.append( ); } // Create stream from String Builder InputStream is = IOUtils.toInputStream(builder.toString()); // Setup our input stream as the source for the local infile statement.setLocalInfileInputStream(is); // Execute the load infile statement.execute(statementText); // Turn the checks back on statement.execute("ALTER TABLE affinity ENABLE KEYS"); statement.execute("SET UNIQUE_CHECKS=1; "); } }