以编程方式通过Java导入(mysql)数据库转储

如何通过java程序以编程方式导入mysql数据库转储文件(包含insert和create table语句)。 我需要这个作为unit testing的设置阶段。

不幸的是,这不起作用:

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

谢谢

PS – 在Rails中,我使用fixture来填充测试数据库。 我通过设置要测试的环境来创建底层表来创建底层表,Java中的任何类似的东西。

如果您可以在运行导入的任何地方访问mysql可执行文件,则可以从java启动新进程并执行此命令。 像这样的东西:

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

备份:

 /******************************************************/ //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”); } 

我个人不赞成以这种方式加载常规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

有效的解决方案可在此处找到:

https://stackoverflow.com/a/1044837

这解释了如何通过jdbc运行任何sql脚本。