【问题标题】:How to change current database to another?Java,如何将当前数据库更改为另一个?
【发布时间】:2012-11-06 03:59:30
【问题描述】:

我有一个与 MySQL 数据库的 Java 程序连接,如何在同一连接上将当前数据库更改为不同的数据库?

我像这样连接到 MySQL:

DriverManager.getConnection("jdbc:mysql://"+server+"/",log,pass);

经过一些操作后,我想在同一连接上连接到不同的 mysql 数据库。我该怎么做?

我尝试使用:

Statement stat= con.createStatement();
ResultSet r=stat.executeQuery("use mysql"); 

但这不会改变要使用的数据库。

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    MySQL documentation 中所述,您需要使用Connection.setCatalog() 切换到另一个数据库。它还明确表示您应该执行USE <databasename> 进行切换。

    此警告的原因是 JDBC 是数据库的通用接口,因此为大多数常见任务提供了方法,包括切换catalogs(或databases,因为它们在 MySQL 中)。 JDBC 规范/javadoc 还明确指出人们应该使用 API 而不是数据库特定的命令(如果两者都可用)。这有几个原因:1) 它促进了独立于数据库的代码,以及 2) 驱动程序可能会在内部执行其他操作以响应 API 方法之一。使用特定于数据库的命令可能会导致驱动程序行为异常,因为其内部状态与数据库状态不匹配。

    setCatalog(String) 的调用不会影响现有语句,如 JDBC API 文档中所述:

    调用setCatalog 对先前创建或准备的Statement 对象没有影响。当调用Connection 方法prepareStatementprepareCall 时,DBMS 准备操作是否立即发生由实现定义。为获得最大的可移植性,应在创建或准备 Statement 之前调用 setCatalog

    【讨论】:

    • 需要补充的是,在调用Connection.setCatalog()之前创建的语句仍然会访问之前的数据库。
    • @Max 你知道这是在 JDBC 规范中指定的,还是 MySQL 实现特定的规则?我通常使用 Firebird,因为它没有目录,所以我通常会掩盖这些细节;)
    • @MarkRotteveel 老实说我不知道​​。我刚刚尝试按照您的建议切换数据库,并且仅在重新创建语句后才起作用。
    • @Max 好的,刚刚查了一下:它在 API 文档中指定。我会在我的回答中添加对它的引用。
    【解决方案2】:

    您可以像这样在表名上添加数据库名称的前缀。

    例如:db1 has table1db2 has table2

    select * from db1.table1, db2.table2;
    

    这将允许您进行跨数据库查询

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2016-04-11
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多