Uso de datos de carga MySQL
En bases de datos, la forma más común de escribir datos es escribir a través de SQL Insert y, además, restaurar la base de datos a través de archivos de copia de seguridad. Este archivo de copia de seguridad es un script SQL en MySQL, pero en realidad se ejecuta en declaraciones de inserción por lotes.
En la práctica, a menudo se encuentran dos tipos de problemas: uno es la importación de datos, como importar datos de Word, Tabla de Excel o documentos de TXT (estos datos generalmente provienen de documentos ingresados por personal no técnico a través de herramientas de oficina); El otro es el intercambio de datos, como el intercambio de datos entre las bases de datos MySQL, Oracle y DB2.
Esto enfrenta un problema: existen diferencias en los scripts SQL de la base de datos, y SQL Exchange es más problemático. Sin embargo, casi todas las bases de datos admiten la exportación de datos de texto (Load) (exportación). Usando esto, podemos resolver los problemas de intercambio de datos e importación mencionados anteriormente.
La instrucción DatainFile de carga de MySQL se usa para leer filas de un archivo de texto a alta velocidad y cargarlas en una tabla. El nombre del archivo debe ser una cadena literal. La siguiente es una descripción de muestra de MySQL5, que ilustra cómo usar el comando LoadData de MySQL para implementar la importación de datos de texto.
Nota: El texto mencionado aquí es el texto con un determinado formato, como las ramas de texto, cada línea está separada por el mismo símbolo, etc. Por lo tanto, hay muchas formas de obtener dicho texto, como guardar las palabras y las tablas de Excel en texto, o un archivo CSV.
En el proyecto, el entorno utilizado es cargar rápidamente un archivo CSV. El sistema original utilizó la base de datos DB2, y luego una función similar a LoadData de MySQL se llama sysproc.db2load. Sin embargo, LoadData no se puede usar en los procedimientos almacenados de MySQL. Este método se llama en el código Java al tomar el método.
Ejemplo de implementación:
Preparar el formulario de prueba
SQL es el siguiente:
Use test; cree la tabla `test` (` id` int (10) unsigned no null auto_incement, `a` int (11) no null,` b` bigint (20) unsigned no null, `c` bigint (20) unsigned no null,` d` int (10) no indignado no null, `e` int (10) sin fingir, no nulo,` `int (10) int (10) no indignado, no unsinfled no null,` `int (10) sin fin. NULL, CLAVE PRIMARIA (`ID`), KEY` A_B` (`A`,` B`)) MOTOR = InnoDB Auto_Increment = 1 Charset = UTF8
El código Java es el siguiente:
paquete com.seven.dbtools.dbtools; importar org.apache.log4j.logger; import org.springframework.jdbc.core.jdbctemplate; import java.io.bytearrayinputputstream; import java.io.inputstream; import java.sql.connection; import java.sql.prepers java.sql.sqlexception; import javax.sql.dataSource;/** * @author siete * @since 07.03.2013 */public class bulkloadData2Mysql {private estático estático estágero final logger = logger.getLogger (bulkloadData2Mysql.class); JDBCTemplate privado JDBCTemplate; Conexión privada Conn = NULL; public void setDataSource (DataSource DataSource) {this.jdbctemplate = new JDBCTemplate (DataSource); } public static inputStream getTestDatainputStream () {StringBuilder Builder = new StringBuilder (); para (int i = 1; i <= 10; i ++) {for (int j = 0; j <= 10000; j ++) {builder.append (4); builder.append ("/t"); Builder.append (4 + 1); builder.append ("/t"); builder.append (4 + 2); builder.append ("/t"); Builder.append (4 + 3); builder.append ("/t"); Builder.append (4 + 4); builder.append ("/t"); Builder.append (4 + 5); builder.append ("/n"); }} byte [] bytes = builder.ToString (). getBytes (); InputStream es = nuevo bytearrayInputStream (bytes); el regreso es; } / ** * * Cargue datos masivos de inputStream a mysql * / public int bulkloadFromInputStream (String LoadDatasql, InputStream DataStream) lanza SQLException {if (DataStream == NULL) {logger.info ("InputStream es NULL, no se importan datos"); regresar 0; } conn = jdbctemplate.getDataSource (). getConnection (); Declaración de preparación = Conn.PrepareStatement (LoadDatasql); int resultado = 0; if (Declary.ISWrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.PreparedStatement mySqlStatement = Declary.unwrap (com.mysql.jdbc.preparedStatement.class); mysqlStatement.setLocalInFileInputStream (dataStream); resultado = mysqlStatement.exCuteUpdate (); } resultado de retorno; } public static void main (string [] args) {string testSql = "Cargar datos locales infile 'sql.csv' ignorar en la tabla test.test (a, b, c, d, e, f)"; InputStream dataStream = getTestDataInputStream (); BulkloadData2Mysql dao = new bulkloadData2Mysql (); intente {long begIntime = System.CurrentTimemillis (); int filas = dao.bulkloadFromInputStream (testSql, dataStream); Long Time = System.CurrentTimemillis (); logger.info ("Importar" + filas + "Los datos de las filas en mysql y costo" + (endtime - begintime) + "ms!"); } Catch (Sqlexception e) {E.PrintStackTrace (); } System.exit (1); }}pista:
El código en el ejemplo utiliza el método setLocalInFileInputStream, que ignorará directamente el nombre del archivo e importará la secuencia IO en la base de datos. En la implementación real, también puede cargar el archivo en el servidor, luego leer el archivo y luego importar el archivo. En este momento, se debe eliminar el parámetro local de los datos de carga, y el nombre del archivo debe ser el nombre de la ruta absoluta completa.
Finalmente, se adjunta la sintaxis de infile de datos de carga
Carga de datos [Low_Priority | Concurrente] [local] infile 'file_name.txt' [reemplazar | Ignorar] en la tabla tbl_name [campos [terminado por 'string'] [[opcionalmente] encerrado por 'char'] [escapado por 'char']] [líneas [comenzando por 'string'] [terminado por 'string']] [Ignorar líneas de números] [(col_name_or_user_var, ...)] [set col_name = expr, ...]]]
Resumir
LoadData es un comando muy útil. Es más rápido importar datos desde un archivo que una declaración de inserción. La documentación de MySQL dice que es aproximadamente 20 veces más rápido. Sin embargo, hay muchas opciones para comandos, pero la mayoría de ellas no se pueden usar. Si realmente lo necesita, simplemente lea la documentación oficial al usarla.