主页 >> 程序猿的东西 >> 初探JDBC元数据类

初探JDBC元数据类

背景

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