Penggunaan Data Muatan MySQL
Dalam database, cara paling umum untuk menulis data adalah dengan menulis melalui SQL Insert, dan di samping itu, untuk mengembalikan database melalui file cadangan. File cadangan ini adalah skrip SQL di MySQL, tetapi sebenarnya dieksekusi dalam pernyataan insert batch.
Dalam praktiknya, dua jenis masalah sering ditemui: satu adalah impor data, seperti mengimpor data dari Word, Excel Table atau dokumen TXT (data ini umumnya berasal dari dokumen yang dimasukkan oleh personel non-teknis melalui alat kantor); Yang lainnya adalah pertukaran data, seperti pertukaran data antara database MySQL, Oracle, dan DB2.
Ini menghadapi masalah: ada perbedaan dalam skrip SQL database, dan SQL Exchange lebih merepotkan. Namun, hampir semua database mendukung Impor Data Teks (Load) Ekspor (Ekspor). Dengan menggunakan ini, kami dapat menyelesaikan masalah pertukaran data dan impor yang disebutkan di atas.
Pernyataan Load DatainFile MySQL digunakan untuk membaca baris dari file teks dengan kecepatan tinggi dan memuatnya ke dalam tabel. Nama file harus berupa string literal. Berikut ini adalah deskripsi sampel dari MySQL5, yang menggambarkan cara menggunakan perintah LoadData MySQL untuk mengimplementasikan impor data teks.
Catatan: Teks yang disebutkan di sini adalah teks dengan format tertentu, seperti cabang teks, setiap baris dipisahkan oleh simbol yang sama, dll. Jadi, ada banyak cara untuk mendapatkan teks tersebut, seperti menyimpan kata dan tabel excel ke dalam teks, atau file CSV.
Dalam proyek, lingkungan yang digunakan adalah dengan cepat mengunggah file CSV. Sistem asli menggunakan database DB2, dan kemudian fungsi yang mirip dengan muatan MySQL disebut sysproc.db2load. Namun, LoadData tidak dapat digunakan dalam prosedur tersimpan MySQL. Metode ini dipanggil dalam kode Java saat mengambil metode.
Contoh Implementasi:
Siapkan Formulir Tes
SQL adalah sebagai berikut:
Gunakan tes; buat tabel `tes` (` id` int (10) tidak ditandatangani bukan null auto_increment, `a` int (11) bukan nol,` b` bigint (20) tidak ditandatangani bukan nol, `c` bigint (20) tidak ditandatangani nol,` d` int (10) tidak ditandatangani bukan nol, tidak ada (tidak ada null (tidak ada nol (tidak ada nol (tidak ada nol (tidak ada nol (tidak ada nol (tidak ada nol (tidak ada nol (tidak ada nol (tidak ada nol, `d` d` non -null,` non `co. Null, kunci primer (`id`), kunci` a_b` (`a`,` b`)) engine = innodb auto_increment = 1 charset = utf8
Kode Java adalah sebagai berikut:
Paket com.seven.dbtools.dbtools; impor org.apache.log4j.logger; impor org.springframework.jdbc.core.jdbctemplate; impor java.io.bytearrayInputStream; impor java.io.inputstream; impor java.sql; java.sql.sqlexception; import javax.sql.datasource;/** * @author tujuh * @since 07.03.2013 */kelas publik bulkloadData2mysql {private static logger = logger.getLogger (bulkloadlataq. Private Jdbctemplate Jdbctemplate; koneksi pribadi conn = null; public void setDataSource (DataSource DataSource) {this.jdbctemplate = new jdbctemplate (DataSource); } public static inputStream getTestDataInputStream () {stringBuilder builder = new StringBuilder (); untuk (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.Perampangan (4 + 2); builder.append ("/t"); Builder.Perampangan (4 + 3); builder.append ("/t"); Builder.Perampangan (4 + 4); builder.append ("/t"); Builder.Append (4 + 5); builder.append ("/n"); }} byte [] bytes = builder.toString (). getBytes (); InputStream adalah = bytearrayInputStream baru (bytes); kembali adalah; } / ** * * Muat data curah dari inputStream ke mysql * / int int bulkloadfrominputStream (string loadDataSql, inputStream DataStream) melempar sqlexception {if (dataStream == null) {logger.info ("inputStream adalah null, tidak ada data yang diimpor") {logger.info ("InputStream adalah null, tidak ada data yang diimpor"; kembali 0; } conn = jdbctemplate.getDataSource (). getConnection (); Pernyataan Persiapan = Conn.PrepareStatement (LoadDataSQL); Hasil int = 0; if (pernyataan.iswrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.preparedstatement mysqlstatement = pernyataan.unwrap (com.mysql.jdbc.preparedstatement.class); mysqlstatement.setLocalInfileInputStream (DataStream); hasil = mysqlstatement.executeUpdate (); } hasil pengembalian; } public static void main (string [] args) {string testsql = "LOAD Data DATA LOKAL INFILE 'SQL.CSV' Abaikan ke dalam TABEL TEST.TEST (A, B, C, D, E, F)"; InputStream DataStream = getTestDataInputStream (); BulkloadData2mysql dao = new BulkloadData2mysql (); coba {long beginTime = system.currentTimeMillis (); int rows = dao.bulkloadFrominputStream (testsql, datastream); Long Endtime = System.CurrentTimeMillis (); logger.info ("mengimpor" + baris + "baris data ke mysql dan biaya" + (endtime - begintime) + "ms!"); } catch (sqlexception e) {e.printstacktrace (); } System.exit (1); }}petunjuk:
Kode dalam contoh menggunakan metode setLocalInfileInputStream, yang akan secara langsung mengabaikan nama file dan mengimpor aliran IO ke dalam database. Dalam implementasi aktual, Anda juga dapat mengunggah file ke server, kemudian membaca file dan kemudian mengimpor file. Pada saat ini, parameter lokal dari data beban harus dihapus, dan nama file harus menjadi nama jalur absolut lengkap.
Akhirnya, memuat sintaks infile data terpasang
Memuat data [low_priority | Concurrent] [lokal] infile 'file_name.txt' [ganti | Abaikan] ke dalam tabel tbl_name [bidang [diakhiri dengan 'string'] [[opsional] tertutup oleh 'char'] [dilarikan oleh 'char']] [baris [mulai dengan 'string'] [diakhiri dengan 'string']] [abaikan baris nomor] [(col_name_or_user_var, ...) [set col_name = ...
Meringkaskan
LoadData adalah perintah yang sangat berguna. Lebih cepat mengimpor data dari file daripada pernyataan insert. Dokumentasi MySQL mengatakan sekitar 20 kali lebih cepat. Namun, ada banyak opsi untuk perintah, tetapi kebanyakan dari mereka tidak dapat digunakan. Jika Anda benar -benar membutuhkannya, cukup baca dokumentasi resmi saat menggunakannya.