Utilisation des données de charge MySQL
Dans les bases de données, la façon la plus courante d'écrire des données est d'écrire via l'insert SQL, et en plus, de restaurer la base de données via des fichiers de sauvegarde. Ce fichier de sauvegarde est un script SQL dans MySQL, mais il est en fait exécuté dans des instructions d'insertion par lots.
En pratique, deux types de problèmes sont souvent rencontrés: l'une est l'importation de données, comme l'importation de données de Word, Excel Table ou TXT Documents (ces données proviennent généralement de documents saisis par du personnel non technique via des outils de bureau); L'autre est l'échange de données, tel que l'échange de données entre les bases de données MySQL, Oracle et DB2.
Cela fait face à un problème: il existe des différences dans les scripts SQL à base de données, et SQL Exchange est plus gênant. Cependant, presque toutes les bases de données prennent en charge l'exportation d'importation de données du texte (charge) (exportation). En utilisant cela, nous pouvons résoudre l'échange de données et l'importation des problèmes mentionnés ci-dessus.
L'instruction MySQL Load Datainfile est utilisée pour lire les lignes à partir d'un fichier texte à grande vitesse et les charger dans une table. Le nom de fichier doit être une chaîne littérale. Ce qui suit est un exemple de description de MySQL5, qui illustre comment utiliser la commande LoadData de MySQL pour implémenter l'importation de données de texte.
Remarque: Le texte mentionné ici est le texte avec un certain format, tel que les branches de texte, chaque ligne est séparée par le même symbole, etc. Ainsi, il existe de nombreuses façons d'obtenir un tel texte, tels que la sauvegarde des tables Word et Excel dans le texte, ou un fichier CSV.
Dans le projet, l'environnement utilisé est de télécharger rapidement un fichier CSV. Le système d'origine a utilisé la base de données DB2, puis une fonction similaire à LoadData de MySQL est appelée sysproc.db2load. Cependant, LoadData ne peut pas être utilisé dans les procédures stockées MySQL. Cette méthode est appelée dans le code Java lors de la prise de la méthode.
Exemple d'implémentation:
Préparer le formulaire de test
SQL est le suivant:
Utiliser le test; Créer un tableau `test '(` id` int (10) non signé pas null auto_increment, `a` int (11) pas null,` b` bigint (20) non signé non null, `c` bigint (20) non signé non null,` d` int (10) non signé, non signé (10) non signé, non nul, `f' 10)` `e` non (10) non manqué, non nul,` f '10) non signal Null, clé primaire (`id`), clé` a_b` (`a`,` b`)) moteur = innodb auto_increment = 1 charset = utf8
Le code Java est le suivant:
package com.seven.dbtools.dbtools; import org.apache.log4j.logger; import org.springframework.jdbc.core.jdbctemplate; import java.io.bytearrayinputStream; import java.io.inputStream; Importer java.sql.connex java.sql.sqlexception; Importer javax.sql.datasource; / ** * @author sept * @Since 07.03.2013 * / classe publique BulkloadData2Mysql {private static Logger Logger = Logger.getLogger (BulkloadData2Mysql.Class); JDBCTemplate privé JDBCTemplate; connexion privée conn = null; public void setDataSource (dataSource dataSource) {this.jdbctemplate = new JDBCTemplate (dataSource); } public static inputStream getTestDatainputStream () {StringBuilder builder = new StringBuilder (); pour (int i = 1; i <= 10; i ++) {pour (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 est = new ByteArrayInputStream (octets); Le retour est; } / ** * * Chargez les données en vrac de InputStream à MySQL * / public int bulkloadFroMInputStream (String LoadDatasql, InputStream DataStream) lève SQELLEXception {if (datastream == null) {logger.info ("inputStream est null, aucune donnée n'est importée"); retour 0; } conn = jdbctemplate.getDataSource (). getConnection (); Instruction PREPAYSATSATION = Conn.PrepareStatement (LoadDataSQL); INT Result = 0; if (instruction.iswrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.preparedStatement mysqlstatement = state.unwrap (com.mysql.jdbc.preparedStatement.class); mysqlstatement.setLocalInFileInputStream (dataStream); result = mysqlstatement.executeupdate (); } Retour Résultat; } public static void main (String [] args) {String testsql = "Données de chargement local infile 'sql.csv' ignorer dans la table test.test (a, b, c, d, e, f)"; InputStream dataStream = getTestDatainputStream (); BulkloadData2Mysql dao = new BulkloadData2Mysql (); essayez {long begintime = System.currenttimemillis (); intwows = dao.bulkloadFroMInputStream (TestSQL, dataStream); Long EndTime = System.CurrentTimemillis (); logger.info ("importation" + lignes + "lignes de données dans MySQL et coût" + (endtime - begintime) + "ms!"); } catch (sqlexception e) {e.printStackTrace (); } System.exit (1); }}indice:
Le code de l'exemple utilise la méthode setLocalinFileInputStream, qui ignorera directement le nom de fichier et importera le flux IO dans la base de données. Dans l'implémentation réelle, vous pouvez également télécharger le fichier sur le serveur, puis lire le fichier, puis importer le fichier. À l'heure actuelle, le paramètre local des données de charge doit être supprimé et le nom de fichier doit être le nom du chemin absolu complet.
Enfin, la syntaxe infilée des données de chargement est attachée
Données de chargement [Low_priority | Concurrent] [local] infile 'file_name.txt' [Remplacer | Ignore] dans la table tbl_name [champs [terminé par 'String'] [[éventuellement] enfermé par 'char'] [échappé par 'char']] [lignes [à partir de 'String'] [terminé par 'String']] [Ignore Number Lines] [(Col_Name_or_User_Var, ...)] [Set Col_name = Expr, ...]]]
Résumer
LoadData est une commande très utile. Il est plus rapide d'importer des données à partir d'un fichier qu'une instruction INSERT. La documentation MySQL dit que c'est environ 20 fois plus rapide. Cependant, il existe de nombreuses options pour les commandes, mais la plupart d'entre elles ne peuvent pas être utilisées. Si vous en avez vraiment besoin, lisez simplement la documentation officielle lorsque vous l'utilisez.