我有一个库需要在Java中从MySQL创建一个模式。目前,我有一个转储的模式,我只需将其输入mysql
命令。这工作不错,但由于它并不理想:创建一个数据库/从Java执行一堆mysql语句
- 它是脆:在
mysql
命令需要在路径上:通常不会对OSX或Windows无需额外配置工作。 - 也很脆弱,因为模式存储为语句,而不是描述
- Java已经可以访问MySQL数据库,所以依靠外部程序来执行此操作似乎很愚蠢。
有没有人知道更好的方法来做到这一点?也许...
- 我可以从文件中读取语句并直接从Java中执行它们?有没有办法做到这一点,不涉及解析分号和手动划分语句?
- 我可以以某种其他方式(作为配置文件或直接在Java中)存储架构,而不是以语句形式存在(以rails的
db:schema
或database.yml
的样式),并且有一个库将根据此描述创建架构?
下面是现有的代码,其工作(当mysql
是在命令行上)的一个片段:
if(db == null) throw new Exception ("Need database name!");
String userStr = user == null ? "" : String.format("-u %s ", user);
String hostStr = host == null ? "" : String.format("-h %s ", host);
String pwStr = pw == null ? "" : String.format("-p%s ", pw);
String cmd = String.format("mysql %s %s %s %s", hostStr, userStr, pwStr, db);
System.out.println(cmd + " < schema.sql");
final Process pr = Runtime.getRuntime().exec(cmd);
new Thread() {
public void run() {
try (OutputStream stdin = pr.getOutputStream()) {
Files.copy(f, stdin);
}
catch (IOException e) { e.printStackTrace(); }
}
}.start();
new Thread() {
public void run() {
try (InputStream stdout = pr.getInputStream()) {
ByteStreams.copy(stdout, System.out);
}
catch (IOException e) { e.printStackTrace(); }
}
}.start();
int exitVal = pr.waitFor();
if(exitVal == 0)
System.out.println("Create db succeeded!");
else
System.out.println("Exited with error code " + exitVal);
您是否尝试过使用ant和sql任务,它只需要数据库驱动程序(jar文件)来执行SQL便携式。 (http://ant.apache.org/manual/Tasks/sql.html)您也可以尝试集成到ant的DBDeploy java库,并允许您增量部署SQL(http://dbdeploy.com/) – 2013-03-18 17:39:59