背景
最近在研究一些数据血缘的事情,需要一些用来管理元数据的类。首先我希望他可以满足元数据的表示和基本运算,然后我希望他足够的常用,以便在设置元数据的时候少一些转换工作。在求助了 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做了初步的研究之后,我还是决定放弃了。首先是这个元数据类非常的复杂,因为业务场景的关系吧,他上面保存了非常多的令人看不懂的参数,而真正为我所关注的表结构部分,反而被设计的无足轻重。我们看到上面的所有表名和字段名,都是用一些奇怪的标签来表示的。
