使用 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
可以使用Java的JDBC API获取MySQL字段类型。下面是一个简单的示例代码,演示如何使用JDBC API获取MySQL数据库字段字段类型和字段注释: ```java import java.sql.*; public class MySQLTableInfo { public static void main(String[] args) throws Exception { // 驱动程序名 String driver = "com.mysql.cj.jdbc.Driver"; // 数据库连接URL String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC"; // 数据库用户名 String user = "root"; // 数据库密码 String password = "password"; // 加载驱动程序 Class.forName(driver); // 建立数据库连接 Connection conn = DriverManager.getConnection(url, user, password); // 获取数据库元数据 DatabaseMetaData dbmd = conn.getMetaData(); // 获取指定的元数据 ResultSet rs = dbmd.getColumns(null, null, "table_name", null); // 遍历结果集 while (rs.next()) { // 获取字段名 String columnName = rs.getString("COLUMN_NAME"); // 获取字段类型 String columnType = rs.getString("TYPE_NAME"); // 获取字段注释 String columnComment = rs.getString("REMARKS"); // 输出结果 System.out.println("Column Name: " + columnName); System.out.println("Column Type: " + columnType); System.out.println("Column Comment: " + columnComment); } // 关闭结果集、数据库连接等资源 rs.close(); conn.close(); } } ``` 请注意,示例代码中的“table_name”应替换为实际的名。此外,还需根据实际情况修改数据库连接URL、用户名和密码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值