Java 获取连接的mysql数据库名称(JDBC)

Java 获取连接的mysql数据库名称(JDBC),java,mysql,jdbc,Java,Mysql,Jdbc,如何从连接对象获取数据库名称的名称 try { this.ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/amger"); } catch (NamingException ne) { } Connection conObj = ds.getConnection(); 如何从con获取该数据库名如果您知道DB是Mysql,您可以在连接上执行SELECT Database(),然后读取包含当前数据库名的结

如何从连接对象获取数据库名称的名称

try {
    this.ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/amger");
} catch (NamingException ne) {
}
Connection conObj = ds.getConnection();

如何从con获取该数据库名如果您知道DB是Mysql,您可以在连接上执行
SELECT Database()
,然后读取包含当前数据库名的结果集


下面是数据库功能的示例。

假设您使用url作为“jdbc:mysql://localhost/test"

然后执行以下操作:

DatabaseMetaData dmd = connection.getMetaData();
String url = dmd.getURL();
System.out.println(url.substring(url.lastIndexOf("/") + 1));

从JDBC连接对象本身获取数据库名称最简单的方法可能是通过
getCatalog()
方法:

但是,正如Konstantin在下面的评论中指出的,如果通过发出
USE dbname
语句更改当前MySQL数据库,则该值不会更改

getCatalog()
在以下应用程序中可能仍然有用:

  • 不更改数据库,或
  • 使用
    setCatalog()
    更改当前数据库,以“JDBC方式”进行操作
但是对于MySQL,使用
selectdatabase()
总体上看起来更安全

还请注意,
getCatalog()
和实际当前数据库之间的潜在差异取决于特定JDBC驱动程序的行为。出于好奇,我尝试了与Microsoft JDBC Driver 4.0 for SQL Server类似的操作,并且
。getCatalog()
确实在运行
USE dbname
语句后立即意识到当前数据库的更改。就是代码

String connectionUrl=“jdbc:sqlserver://localhost:52865;"
+“databaseName=myDb;”+“integratedSecurity=true”;
try(Connection con=DriverManager.getConnection(connectionUrl)){
System.out.println(String.format(
“getCatalog()返回:%s”,
con.getCatalog());
try(语句s=con.createStatement()){
System.out.println(“执行:使用主控”);
s、 执行(“使用主机”);
}
System.out.println(String.format(
“getCatalog()返回:%s”,
con.getCatalog());
}捕获(例外e){
e、 printStackTrace(系统输出);
}
结果如下:

getCatalog()返回:myDb
执行:使用master
getCatalog()返回:master
运行

  • 将输出粘贴到记事本中
  • 搜索“databaseName=yourDBName”的值

可能重复的@almasshaikh“如何从java.sql.Connection获取数据库url?”永远不能与数据库名称相同。Idea is from url您可以获取数据库名称吗?如果使用
use
命令或通过
setCatalog()更改数据库,则此操作无效
JDBC同意,但我认为OP没有提到同样的问题。这里的挑战是,尽管不幸的是,数据库元数据和连接实现在DB驱动程序(例如MySQL和Oracle)之间的实现不一致,但JDBC(以及与OP问题更相关的)的全部目的是使其抽象化(但仍然有效)。。。不幸的是,元数据。。。它只是工作不一致——需要一些逻辑与getSchema()、getCatalog()甚至getUserName()的组合。是什么让你这么说的?我很感谢你的意见,并指出了与@Gord Thompson方法有关的问题。对于mysql,您的解决方案是最好的。我只是出于便携性的原因才接受GordThompson,尽管我知道它可能有副作用。非常感谢兄弟们,不客气。我提到了“如果您知道DB是Mysql”,因为任何RDBMS都可以连接到JDBC数据源,但您的问题中有标记Mysql,DATABASE()是Mysql特有的函数。“我认为这个解决方案可能会有帮助。”戈德·汤普森,我同意你的看法。康斯坦丁诉萨利霍夫的精彩表演。我对Konstantin V.Salikhov方法(SELECT DATABASE())感到更舒服,特别是对于MySQL特定的解决方案。但正如您正确地说的那样,“以JDBC方式”做事;连接#getCatalog()在可移植性方面更容易接受,这是Java的优点之一。@konstantinov.Salikhov这也是JDBC api文档明确表示如果存在JDBC等价物(
setCatalog
)就不要使用数据库命令的原因之一。遗憾的是,跨数据库的DatabaseMetaData和连接类的实现不一致。当数据库元数据相关操作(如getPrimaryKeys())需要架构名称,但getCatalog()可以工作(并且可以用作架构名称)时,“getSchema()”的MySQL“schema”名称为null。不幸的是,对于Oracle来说,情况并非如此。
System.out.println(connection.getMetaData().getURL());