2009-12-23 44 views
12

如何通過Java程序以編程方式導入mysql數據庫轉儲文件(包含插入和創建表語句)。我需要這個作爲單元測試的設置階段。以編程方式通過Java導入(mysql)數據庫轉儲

不幸的是,這並不工作:

Connection conn = dbConnectionSource.getConnection(); 
Statement stmt = conn.createStatement(); 
stmt.execute(FileUtils.readFileToString(new File("./some-sql-file"))); 
conn.close(); 

感謝, -A

PS - 在Rails中,我用夾具填充測試數據庫。我讓rails rails通過設置測試環境來創建底層表,在Java中任何類似的東西。

+1

「務實」應該是「以編程方式」 –

回答

10

你可以從你的java啓動一個新的進程,如果你有機會到MySQL的可執行文件,無論你正在運行的執行此命令進口。事情是這樣的:

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("mysql -p -h ServerName DbName < dump.sql"); 
+0

這是*正確*的方式來做到這一點。任何其他方式可能無法在微妙的邊緣情況下工作。編寫Mysql轉儲文件是爲了與mysql客戶端導入,而不是任何其他工具。 – MarkR

+1

只是修復,我們不能在java中使用重定向: Process pr = rt.exec(new String [] {「/ bin/bash」,「 - c」,「mysql -p -h ServerName DbName

+1

關於如何在Windows中做到這一點的任何想法? –

2

就我個人而言,我會不贊成以這種方式加載常規SQL轉儲,因爲您需要非平凡的代碼來解析或至少標記SQL。

我會推薦使用CSV數據轉儲,您可以使用LOAD DATA INFILE語法加載這些轉儲。請參閱:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

當然,您仍然需要確保目標表存在,但是如果您知道只需解析表創建DDL stattemnts,就可以極大地簡化您的java代碼。

注意,您可以使用mysqldump從數據庫中提取CSV數據,請參見:http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_tab

2

備份:

/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = 「dbName」; 
String dbUser = 「dbUser」; 
String dbPass = 「dbPass」; 

/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = 「」; 
executeCmd = 「mysqldump -u 「+dbUser+」 -p」+dbPass+」 「+dbName+」 -r backup.sql」; 
} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 

out.println(「Backup taken successfully」); 

} else { 

out.println(「Could not take mysql backup」); 

} 

還原:

/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = 「dbName」; 
String dbUser = 「dbUser」; 
String dbPass = 「dbPass」; 

/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = 「」; 

executeCmd = new String[]{「/bin/sh」, 「-c」, 「mysql -u」 + dbUser+ 」 -p」+dbPass+」 」 + dbName+ 」 < backup.sql」 }; 

} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 

out.println(「success」); 

} else { 

out.println(「restore failure」); 

} 
相關問題