背景
最近在研究一些数据血缘的事情,需要一些用来管理元数据的类。首先我希望他可以满足元数据的表示和基本运算,然后我希望他足够的常用,以便在设置元数据的时候少一些转换工作。在求助了 ChatGPT 之后,我得到了一个似乎比较完美的答案。那就是 JDBC 内置的元数据类java.sql.DatabaseMetaData
。因为 JDBC 的普及度可以说是数据库 lib里面最高的了,那么他自带的元数据类自然也是最通用的。
Demo 程序
ChatGPT 好人做到底,给出了一些示例程序,用来获取数据库里面的表名和相应的字段,得到了下面的示例程序。
package com.laotie; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; public class MetadataExample { public static void main(String[] args) { try { // Assuming you already have a database connection (con) Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/leetcode", "root", "root"); // Get the database metadata DatabaseMetaData metaData = con.getMetaData(); // Display some metadata information System.out.println("Driver Name: " + metaData.getDriverName()); System.out.println("Driver Version: " + metaData.getDriverVersion()); ResultSet tables = metaData.getTables("leetcode", null, null, null); while (tables.next()) { System.out.println("Table name: "+tables.getString("Table_NAME")); System.out.println("Table type: "+tables.getString("TABLE_TYPE")); System.out.println("Table schema: "+tables.getString("TABLE_SCHEM")); System.out.println("Table catalog: "+tables.getString("TABLE_CAT")); System.out.println("columns: "); ResultSet columns = metaData.getColumns("leetcode", null, tables.getString("Table_NAME"), null); while (columns.next()) { System.out.println(columns.getString("COLUMN_NAME")); } System.out.println(" "); } } catch (Exception e) { e.printStackTrace(); } } }
结论
在对java.sql.DatabaseMetaData
做了初步的研究之后,我还是决定放弃了。首先是这个元数据类非常的复杂,因为业务场景的关系吧,他上面保存了非常多的令人看不懂的参数,而真正为我所关注的表结构部分,反而被设计的无足轻重。我们看到上面的所有表名和字段名,都是用一些奇怪的标签来表示的。