针对 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
用户B 将 tab002 的权限开放给了 用户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新闻热点
疑难解答