通过Java以编程方式导入(mysql)数据库转储
如何通过java程序以编程方式导入mysql数据库转储文件(包含insert和create table语句)。我需要这个作为单元测试的设置阶段 不幸的是,这不起作用:通过Java以编程方式导入(mysql)数据库转储,java,mysql,database,jdbc,Java,Mysql,Database,Jdbc,如何通过java程序以编程方式导入mysql数据库转储文件(包含insert和create table语句)。我需要这个作为单元测试的设置阶段 不幸的是,这不起作用: Connection conn = dbConnectionSource.getConnection(); Statement stmt = conn.createStatement(); stmt.execute(FileUtils.readFileToString(new File("./some-sql-file")));
Connection conn = dbConnectionSource.getConnection();
Statement stmt = conn.createStatement();
stmt.execute(FileUtils.readFileToString(new File("./some-sql-file")));
conn.close();
谢谢,
-A
PS-在Rails中,我使用夹具填充测试数据库。我让rails通过设置要测试的环境来创建底层表,这在Java中是类似的。我个人不喜欢以这种方式加载常规SQL转储,因为您需要非平凡的代码来解析或至少标记SQL 我建议使用CSV数据转储,您可以使用load data INFILE语法加载这些数据转储。见: 当然,您仍然需要确保目标表存在,但是如果您知道只需要解析表创建DDL Statements,这将大大简化java代码
请注意,您可以使用mysqldump从数据库中提取CSV数据,请参阅:如果您在运行导入的任何位置都可以访问mysql可执行文件,则可以从java启动一个新进程并执行此命令。大概是这样的:
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("mysql -p -h ServerName DbName < dump.sql");
Runtime rt=Runtime.getRuntime();
processpr=rt.exec(“mysql-p-hservername DbName
备份:
/******************************************************/
//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”);
}
/******************************************************/
//数据库属性
/******************************************************/
字符串dbName=“dbName”;
字符串dbUser=“dbUser”;
字符串dbPass=“dbPass”;
/***********************************************************/
//执行Shell命令
/***********************************************************/
字符串executeCmd=“”;
executeCmd=newstring[]{/bin/sh',“-c”,“mysql-u”+dbUser+“-p”+dbPass+“+dbName+”
可以在这里找到有效的解决方案:
这说明了如何在jdbc上运行任何sql脚本。“实用性”应该是“编程性”这是正确的方法。任何其他方法都可能无法在微妙的边缘情况下工作。Mysql转储被编写为使用Mysql客户端导入,而不是任何其他工具。只是一个修复,我们不能像java中那样使用重定向:Process pr=rt.exec(新字符串[]{”/bin/bash“,“-c”,“Mysql-p-h-ServerName DbName