MySQL로드 데이터 사용
데이터베이스에서 데이터를 쓰는 가장 일반적인 방법은 SQL Insert를 통해 작성하고 백업 파일을 통해 데이터베이스를 복원하는 것입니다. 이 백업 파일은 MySQL의 SQL 스크립트이지만 실제로 배치 삽입 문으로 실행됩니다.
실제로 두 가지 유형의 문제가 종종 발생합니다. 하나는 Word, Excel Table 또는 TXT 문서에서 데이터 가져 오기와 같은 데이터 가져 오기입니다 (이 데이터는 일반적으로 사무실 도구를 통해 비 기술적 인 직원이 입력 한 문서에서 나옵니다). 다른 하나는 MySQL, Oracle 및 DB2 데이터베이스 간의 데이터 교환과 같은 데이터 교환입니다.
이것은 문제에 직면합니다. 데이터베이스 SQL 스크립트에는 차이가 있으며 SQL Exchange는 더 번거 롭습니다. 그러나 거의 모든 데이터베이스는 텍스트 데이터 가져 오기 (로드) 내보내기 (내보내기)를 지원합니다. 이를 사용하여 위에서 언급 한 데이터 교환 및 가져 오기 문제를 해결할 수 있습니다.
MySQL의 Load DatainFile 문은 고속으로 텍스트 파일의 행을 읽고 테이블에로드하는 데 사용됩니다. 파일 이름은 문자 그대로 문자열이어야합니다. 다음은 MySQL5의 샘플 설명으로 MySQL의 LoadData 명령을 사용하여 텍스트 데이터 가져 오기를 구현하는 방법을 보여줍니다.
참고 : 여기에 언급 된 텍스트는 텍스트 분기와 같은 특정 형식의 텍스트입니다. 각 줄은 동일한 기호로 분리됩니다. 따라서 Word 및 Excel 테이블을 텍스트 또는 CSV 파일에 저장하는 것과 같은 텍스트를 얻는 방법에는 여러 가지가 있습니다.
이 프로젝트에서 사용 된 환경은 CSV 파일을 신속하게 업로드하는 것입니다. 원래 시스템은 DB2 데이터베이스를 사용한 다음 MySQL의 LoadData와 유사한 기능을 sysproc.db2load라고합니다. 그러나 MySQL 저장 프로 시저에는 LoadData를 사용할 수 없습니다. 이 메소드는 메소드를 수행 할 때 Java 코드로 호출됩니다.
구현 예 :
테스트 양식을 준비하십시오
SQL은 다음과 같습니다.
사용 테스트; 테이블 생성`test '(`id` int (10) unull auto_increment,`a` int (11) 님,`b'bigint (20) unnull not null,`c gigned (20)는 null,`int (10) null,`e` int (10) int (10)가 아닌 int (10)가 아닌`````````````int (11),`b` bigint (20) emnull,`c gigned (20)는 null,`````````````````````( NULL, 1 차 키 (`ID`), 키`a_b` (`a`,`b`)) 엔진 = innodb auto_increment = 1 charset = utf8
Java 코드는 다음과 같습니다.
package com.seven.dbtools.dbtools; import org.apache.log4j.logger; import org.springframework.jdbc.core.jdbctemplate; import java.io.bytearrayinputstream; import java.io.inputstream; import java.sql.connection; java.sql.connection; java.sql.sqlexception; import javax.sql.datasource;/** * @author Seven * @since 07.03.2013 */public class bulkloaddata2mysql {private static final logger = logger.getLogger (bulkloadData2mysql.class); 개인 jdbctemplate jdbctemplate; 개인 연결 Conn = NULL; public void setDatasource (DataSource DataSource) {this.jdbctemplate = 새로운 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); 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은 = 새로운 ByteArrayInputStream (bytes); 반환은; } / ** * * inputStream에서 mysql로 벌크 데이터를로드하면 * / public int bulkloadfrominputStream (String loaddatasql, inputStream datastream)이 sqlexception {if (datastream == null) {logger.info ( "inputstream, 데이터가 가져 오지 않음"); 반환 0; } conn = jdbctemplate.getDatasource (). getConnection (); preparedstatement statement = conn.preparestatement (loaddatasql); int result = 0; if (state.iswrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.preparedStatement mysqlstatement = state.unwrap (com.mysql.jdbc.preparedstatement.class); mysqlstatement.setlocalinfileinputstream (datastream); 결과 = mysqlstatement.executeUpdate (); } 반환 결과; } public static void main (string [] args) {String testsql = "로드로드 로컬 infile 'sql.csv'테이블 테스트에 무시됩니다. 테스트 (a, b, c, d, e, f); inputStream datastream = getTestDatainputStream (); bulkloaddata2mysql dao = new bulkloaddata2mysql (); try {long begintime = system.currenttimemillis (); int rows = dao.bulkloadfromInputStream (TestSQL, Datastream); Long Endtime = System.CurrentTimeMillis (); logger.info ( "importing" + rows + "행 데이터는 MySQL로 데이터와 비용" + (EndTime -BegIntime) + "MS!"); } catch (sqlexception e) {e.printstacktrace (); } system.exit (1); }}힌트:
이 예제의 코드는 SetlocalInfileInputStream 메소드를 사용하여 파일 이름을 직접 무시하고 IO 스트림을 데이터베이스로 가져옵니다. 실제 구현에서 파일을 서버에 업로드 한 다음 파일을 읽은 다음 파일을 가져올 수도 있습니다. 현재로드 데이터의 로컬 매개 변수를 제거해야하며 파일 이름은 완전한 절대 경로의 이름이어야합니다.
마지막으로로드 데이터 인프 레일 구문이 첨부됩니다
로드 데이터 [low_priority | Concurren] [local] infile 'file_name.txt'[교체 | 무시] tbl_name [fields [string '으로 종료 됨] [[선택적으로]'char '로 둘러싸인] ['char '로 동봉 된] ['char '로 탈출] [[string'으로 시작하는 줄] [ 'string'으로 종료]] [숫자 줄 무시] [[col_name_or_or_user_var, ...) [set col_name = Expr, ...]].
요약
LoadData는 매우 유용한 명령입니다. 삽입 문보다 파일에서 데이터를 가져 오는 것이 더 빠릅니다. MySQL 문서에 따르면 약 20 배 더 빠릅니다. 그러나 명령에는 많은 옵션이 있지만 대부분은 사용할 수 없습니다. 실제로 필요한 경우 공식 문서를 사용할 때 공식 문서를 읽으십시오.