从Java创建数据库/执行一组mysql语句
我有一个库,需要从Java在MySQL中创建一个模式。目前,我有一个模式转储,我只是将其导入到从Java创建数据库/执行一组mysql语句,java,mysql,database,schema,Java,Mysql,Database,Schema,我有一个库,需要从Java在MySQL中创建一个模式。目前,我有一个模式转储,我只是将其导入到mysql命令中。这可以正常工作,但并不理想,因为: 它很脆弱:mysql命令需要在路径上:如果没有额外的配置,通常无法在OSX或Windows上工作 也很脆弱,因为模式存储为语句,而不是描述性的 Java已经可以访问mysql数据库了,因此依赖外部程序来实现这一点似乎很愚蠢 有人知道更好的方法吗?也许 我可以从文件中读取语句并直接从Java执行它们?有没有一种不需要解析分号和手动分割语句的方法
mysql
命令中。这可以正常工作,但并不理想,因为:
- 它很脆弱:
命令需要在路径上:如果没有额外的配置,通常无法在OSX或Windows上工作mysql
- 也很脆弱,因为模式存储为语句,而不是描述性的
- Java已经可以访问mysql数据库了,因此依赖外部程序来实现这一点似乎很愚蠢
- 我可以从文件中读取语句并直接从Java执行它们?有没有一种不需要解析分号和手动分割语句的方法
- 我可以用其他方式存储模式——要么作为配置文件,要么直接用Java存储,而不是作为语句存储(采用rails的
或db:schema
),有一个库可以根据这个描述创建模式database.yml
mysql
时):
if(db==null)抛出新异常(“需要数据库名!”);
字符串userStr=user==null?“”:String.format(“-u%s”,用户);
字符串hostStr=host==null?“”:String.format(“-h%s”,主机);
字符串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+“
查看,更具体地说,查看该页面上链接到的代码示例。它是一个轻量级的持久层,构建在DBUtils之上,隐藏了处理连接和结果集的所有细节。您还可以像前面提到的那样轻松地加载配置文件。您还可以存储和加载属性文件中的SQL语句和/或在代码中硬编码SQL语句。简短的回答(据我所知)是否定的。
您必须将文件解析为单独的语句
我也遇到过同样的情况,你可以在这里找到很多关于这个话题的问题。
有些将显示解析器。其他人可以直接使用apache中的工具,这些工具可以将模式转换为xml格式,然后将其读回
我写这个答案的主要目的是告诉大家我最终选择了使用命令行
- 额外配置:这可能是一项额外的工作,但您可以通过配置或在运行时根据您正在运行的系统来完成。只要你努力一次,你就成功了
- 取决于外部工具:它并不像看上去那么糟糕。你也有一些好处 1-您不需要编写额外的代码或引入额外的库来解析模式命令 2-工具由供应商提供。它可能比任何其他进行解析的代码都要经过更多的调试和测试 3-从长远来看更安全。数据库发行版附带的工具很可能支持对转储格式的任何“可能”破坏解析器的添加或更改。您不需要对代码进行任何更改 4-您将要使用该工具(创建模式)的操作的性质不建议频繁使用,从而将其成为性能瓶颈的风险降至最低
我希望您能找到满足您需求的最佳解决方案。您是否尝试过使用ant和sql task,它所需要的只是数据库驱动程序(jar文件)来可移植地执行sql。()您还可以尝试DBDeploy java library,它集成到ant并允许您增量部署SQL(),我以前使用的是
DBUtils
,但现在切换到QueryDSL
,因为它更适合我的使用。你是说我应该使用这个库来执行多个语句吗?看起来我仍然需要自己从文件中解析它们。如果您的语句位于.properties文件中,Yank可以读入它们,您可以使用属性文件中的相应键引用该语句。根据您的需要,这可能适用于您,也可能不适用于您。至于执行“CREATEDATABASE”语句,我从来没有用Yank尝试过。抱歉,如果这是你问题的重点的话。这里有很多陈述。我不想手动将它们全部粘贴到.properties
文件中。架构也可以更改,现在可以使用mysqldump
轻松管理,但如果每次更改后都要去编辑.properties
文件,那就不容易了。+1感谢分享您的经验。赞成使用命令行的论点似乎非常合理。当我实现它的时候,我只是觉得它有点像黑客。我同意。这看起来像是一种黑客行为,因为需要访问命令行工具的所有代码:)
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);