Java,如何将当前数据库更改为另一个?
Posted
技术标签:
【中文标题】Java,如何将当前数据库更改为另一个?【英文标题】:How to change current database to another? 【发布时间】: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");
但这不会改变要使用的数据库。
【问题讨论】:
【参考方案1】:如MySQL documentation 中所述,您需要使用Connection.setCatalog()
切换到另一个数据库。它还明确表示您应该不执行USE <databasename>
进行切换。
此警告的原因是 JDBC 是数据库的通用接口,因此为大多数常见任务提供了方法,包括切换catalogs
(或databases
,因为它们在 MySQL 中)。 JDBC 规范/javadoc 还明确指出人们应该使用 API 而不是数据库特定的命令(如果两者都可用)。这有几个原因:1) 它促进了独立于数据库的代码,以及 2) 驱动程序可能会在内部执行其他操作以响应 API 方法之一。使用特定于数据库的命令可能会导致驱动程序行为异常,因为其内部状态与数据库状态不匹配。
对 setCatalog(String)
的调用不会影响现有语句,如 JDBC API 文档中所述:
调用
setCatalog
对先前创建或准备的Statement
对象没有影响。当调用Connection
方法prepareStatement
或prepareCall
时,DBMS 准备操作是否立即发生由实现定义。为获得最大的可移植性,应在创建或准备Statement
之前调用setCatalog
。
【讨论】:
需要补充的是,在调用Connection.setCatalog()
之前创建的语句仍然会访问之前的数据库。
@Max 你知道这是在 JDBC 规范中指定的,还是 MySQL 实现特定的规则?我通常使用 Firebird,因为它没有目录,所以我通常会掩盖这些细节;)
@MarkRotteveel 老实说我不知道。我刚刚尝试按照您的建议切换数据库,并且仅在重新创建语句后才起作用。
@Max 好的,刚刚查了一下:它在 API 文档中指定。我会在我的回答中添加对它的引用。【参考方案2】:
您可以像这样在表名上添加数据库名称的前缀。
例如:db1 has table1
和 db2 has table2
select * from db1.table1, db2.table2;
这将允许您进行跨数据库查询
【讨论】:
以上是关于Java,如何将当前数据库更改为另一个?的主要内容,如果未能解决你的问题,请参考以下文章
将 AppDomain.CurrentDomain 基本目录更改为另一个项目目录