首页 > 数据库 > MySQL > 正文

使用 JDBC API 获取 Mysql 的 表字段 时,返回为空 的解决方案

2024-07-24 12:59:23
字体:
来源:转载
供稿:网友

针对 MySQL 数据库,考虑下面这种场景

用户 A ,创建了一个 database,取名为 test,test中有一个表,叫 tab001

test 的 jdbc url 则为: jdbc:mysql://localhost:3306/test

用户 B ,创建了一个 database,取名为 demo,demo中有一个表,叫 tab002

demo 的 jdbc url 则为: jdbc:mysql://localhost:3306/demo

用户Btab002 的权限开放给了 用户A

请问,在给定 用户A的jdbc url、用户名、密码的情况下,如何通过 JDBC 的 API 获取 tab002 中的所有字段?

我们知道,JDBC 中获取表的字段的 API 为:

Connection connection = DriverManager.getConnection(jdbc_url, userName, passWord);DatabaseMetaData dbMetaData = connection.getMetaData();// 获取指定 catalog 下的指定 schema 下的指定 table 的所有字段ResultSet colRet = dbMetaData.getColumns(catalog, schema, table, "%");

所以,针对上面这种场景,我们可能会直接写出如下处理代码:

ResultSet colRet = dbMetaData.getColumns(null, "demo", "tab002", "%");

但是,当你这么做了之后,你会发现,你获取到的 ResultSet 中是不会包括任何 column 的信息的。

所以,我一度怀疑 mysql 的jdbc driver 在实现 JDBC 的接口时,是有Bug存在的。

但是,当我在万能的 stack overflow 上找到了下面的答案之后,突然发现的另外的解法: DatabaseMetaData#getColumns returns an empty ResultSet

按照上面的链接里的做法,我将代码改成了如下:

ResultSet colRet = dbMetaData.getColumns("demo", null, "tab002", "%");

Bingo! 你会发现,tab002 中的所有字段都获取到了。

当然,上面的链接里,也有人反应这种做法是 NG 的,所以,这种做法可能跟 jdbc driver 的版本、mysql 的版本 有关系,我的测试环境是:

Mysql 版本: 5.1.73jdbc driver 版本: 5.1.38
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表