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

13 篇文章 0 订阅
8 篇文章 0 订阅

针对 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.73
  • jdbc driver 版本: 5.1.38
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值