Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java以编程方式导入(mysql)数据库转储_Java_Mysql_Database_Jdbc - Fatal编程技术网

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

通过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")));

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

不幸的是,这不起作用:

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