針對 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新聞熱點
疑難解答