Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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_Schema - Fatal编程技术网

从Java创建数据库/执行一组mysql语句

从Java创建数据库/执行一组mysql语句,java,mysql,database,schema,Java,Mysql,Database,Schema,我有一个库,需要从Java在MySQL中创建一个模式。目前,我有一个模式转储,我只是将其导入到mysql命令中。这可以正常工作,但并不理想,因为: 它很脆弱:mysql命令需要在路径上:如果没有额外的配置,通常无法在OSX或Windows上工作 也很脆弱,因为模式存储为语句,而不是描述性的 Java已经可以访问mysql数据库了,因此依赖外部程序来实现这一点似乎很愚蠢 有人知道更好的方法吗?也许 我可以从文件中读取语句并直接从Java执行它们?有没有一种不需要解析分号和手动分割语句的方法

我有一个库,需要从Java在MySQL中创建一个模式。目前,我有一个模式转储,我只是将其导入到
mysql
命令中。这可以正常工作,但并不理想,因为:

  • 它很脆弱:
    mysql
    命令需要在路径上:如果没有额外的配置,通常无法在OSX或Windows上工作
  • 也很脆弱,因为模式存储为语句,而不是描述性的
  • 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);