Uso de dados de carga MySQL
Nos bancos de dados, a maneira mais comum de escrever dados é escrever através do SQL Insert e, além disso, para restaurar o banco de dados por meio de arquivos de backup. Esse arquivo de backup é um script SQL no MySQL, mas na verdade é executado em instruções de inserção de lote.
Na prática, dois tipos de problemas são frequentemente encontrados: um é a importação de dados, como importação de dados do Word, Excel Table ou TXT Documents (esses dados geralmente vêm de documentos inseridos por pessoal não técnico por meio de ferramentas de escritório); O outro é a troca de dados, como a troca de dados entre os bancos de dados MySQL, Oracle e DB2.
Isso enfrenta um problema: existem diferenças nos scripts SQL de banco de dados e o SQL Exchange é mais problemático. No entanto, quase todos os bancos de dados suportam a importação de dados de texto (carregamento) (exportação). Usando isso, podemos resolver os problemas de troca de dados e importação mencionados acima.
A instrução DatainFile de carga do MySQL é usada para ler linhas de um arquivo de texto em alta velocidade e carregá -las em uma tabela. O nome do arquivo deve ser uma string literal. A seguir, é apresentada uma descrição de amostra do MySQL5, que ilustra como usar o comando loaddata do MySQL para implementar a importação de dados de texto.
NOTA: O texto mencionado aqui é o texto com um determinado formato, como ramificações de texto, cada linha é separada pelo mesmo símbolo, etc. Portanto, existem muitas maneiras de obter esse texto, como salvar as tabelas de palavras e excel no texto ou um arquivo CSV.
No projeto, o ambiente usado é fazer o upload rapidamente de um arquivo CSV. O sistema original usou o banco de dados DB2 e, em seguida, uma função semelhante ao loaddata do MySQL é chamada sysproc.db2load. No entanto, o loaddata não pode ser usado nos procedimentos armazenados do MySQL. Este método é chamado no código Java ao tomar o método.
Exemplo de implementação:
Prepare o formulário de teste
O SQL é o seguinte:
USE test;CREATE TABLE `test` (`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,`a` int(11) NOT NULL,`b` bigint(20) UNSIGNED NOT NULL,`c` bigint(20) UNSIGNED NOT NULL,`d` int(10) UNSIGNED NOT NULL,`e` int(10) UNSIGNED NOT NULL,`f` int(10) UNSIGNED NOT NULL, Chave primária (`id`), key` a_b` (`a`,` b`)) mecan
O código Java é o seguinte:
pacote com.seven.dbtools.dbtools; importar org.apache.log4j.logger; importar org.springframework.jdbc.core.jdbctemplate; import java.io.byTearArrayinTream; import java.InputStram; java.sql.sqLexception; importar javax.sql.dataSource;/** * @Author sete * @since 07.03.2013 */public class BulkloadData2Mysql {private Static Final Logger = Logger.GetLogger (BulkloadData2mysql.Cl.Cl.Cl) private jdbctemplate jdbctemplate; conexão privada Conn = null; public void setDataSource (DataSource DataSource) {this.jdbcTemplate = new JDBCTemplate (DataSource); } public static inputStream getTestDatainputStream () {StringBuilder Builder = new StringBuilder (); for (int i = 1; i <= 10; i ++) {for (int j = 0; j <= 10000; j ++) {builder.append (4); construtor.append ("/t"); construtor.append (4 + 1); construtor.append ("/t"); construtor.append (4 + 2); construtor.append ("/t"); construtor.append (4 + 3); construtor.append ("/t"); construtor.append (4 + 4); construtor.append ("/t"); construtor.append (4 + 5); construtor.append ("/n"); }} byte [] bytes = builder.toString (). getBytes (); InputStream é = new ByteArrayInputStream (bytes); o retorno é; } / ** * * Carregue dados em massa do InputStream para MySQL * / public int BulkLoadFrominputStream (String loadDatasql, InputStream DatStream) lança SqLexception {if (DataStream == NULL) {Logger.info ("InputStram é Null, nenhum dados é importo"); retornar 0; } conn = jdbcTemplate.getDataSource (). getConnection (); Declaração de estatamento preparado = Conn.Preparestatement (loadDatasql); int resultado = 0; if (declaration.iswrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.preparedStatement mysqlStatement = declaration.unwrap (com.mysql.jdbc.PreparedStatement.Class); mysqlstatement.setLocalInFileInputStream (DataStream); resultado = mysqlstatement.executeUpdate (); } resultado de retorno; } public static void main (string [] args) {string testsql = "Carregue os dados do Infile Local 'sql.csv' ignore no test.test (a, b, c, d, e, f)"; InputStream datastream = getTestDatainputStream (); BulkLoadData2MySQL DAO = novo BulkLoadData2MySQL (); tente {long begintime = System.currenttimemillis (); int linhas = dao.bulkloadfrominputStream (testsql, datastream); Long Endtime = System.CurrentTimemillis (); Logger.info ("Importação" + linhas + "lança dados em mysql e custo" + (EndTime - inicia) + "ms!"); } catch (sqLexception e) {e.printStackTrace (); } System.Exit (1); }}dica:
O código no exemplo usa o método setLocalInFileInputStream, que ignorará diretamente o nome do arquivo e importará o fluxo de IO para o banco de dados. Na implementação real, você também pode fazer o upload do arquivo para o servidor, ler o arquivo e importar o arquivo. No momento, o parâmetro local dos dados de carga deve ser removido e o nome do arquivo deve ser o nome do caminho absoluto completo.
Finalmente, a sintaxe de carga de dados de carga está anexada
Carregar dados [low_priority | Concurrent] [local] infile 'file_name.txt' [Substitua | Ignorar] na tabela tbl_name [campos [encerrado por 'string'] [[opcionalmente] anexado por 'char'] [escapado por 'char']] [linhas [iniciando por 'string'] [encerrado por 'string']] [ignore linhas numéricas] [(expr, ... expr, ...
Resumir
LoadData é um comando muito útil. É mais rápido importar dados de um arquivo do que uma instrução de inserção. A documentação do MySQL diz que é cerca de 20 vezes mais rápida. No entanto, existem muitas opções para comandos, mas a maioria deles não pode ser usada. Se você realmente precisar, basta ler a documentação oficial ao usá -la.