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 方法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;

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

【讨论】:

以上是关于Java,如何将当前数据库更改为另一个?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java或Groovy中将列表值动态更改为另一个列表

如何将当前数组格式更改为对象数组格式?

将 AppDomain.CurrentDomain 基本目录更改为另一个项目目录

如何将登录用户更改为另一个用户?

如何将 UITabBarItem 标题更改为另一个 UITabBarItem 的标题?

如何在 Vue Js 中将数据值从一个组件更改为另一个组件?