天天看點

JDBC擷取資料庫各種資訊

當通過一個JDBC連接配接上一個資料的時候,我們就可以通過JDBC擷取到這個資料的各種資訊,比如資料庫的名稱、模式、表結構(及其字段)、視圖、函數、過程、通路權限等等一系列的資訊。當然,如果你原意,你還可以通路個個表中的資料(隻要你有權限)。

筆者曾接觸Sybase資料庫,Sybase很垃圾,搞了老半天,連個表都看不見,更無從談及通路資料,無奈之下通過JDBC連接配接上資料庫後,将資料的各種資訊一一輸出。

時隔兩年了,近日又在做一個項目的時候,發現很多人都用IDE從表生成POJO,各個工具生成規則也有所不同,一是SQL到Java類型之間的映射政策不一緻。而是生成POJO屬性連個注釋都沒有,一大堆英文描述(實際上全是費屁,我僅僅要的是個字段的含義)。很低級吧,從表到POJO,一般來說都是從對象模組化入手,快速分解問題,建立其領域模型(其中包含實體類之間聯系),如有必要才過渡到資料庫模組化。當然這些都是不是鄙人所能控制的。

既然要大家都要做這一步工作,為了保持映射關系的一緻性,可以定義下Java SQL Type到Java Type之間的一個映射關系,然後讀取各個表名稱、周遊其字段的名稱、類型、注釋等資訊,并将表、字段的注釋資訊拿來作為POJO成員變量的注釋資訊,這就達到目的了,至于getter/setter方法,各個工具都生成的很好,就不用自己再浪費時間幹哪些無聊的工作了。

下面以MySQL5為例,看看實作過程:

首先為了描述表和列的關系,必須做個簡單模組化:

表對象、列對象,之間是一對多關系。

public class TableInfoBean { 

    private String tableName; 

    private String tableComment; 

    private List<ColumnBean> columnList=new ArrayList<ColumnBean>();

public class ColumnBean { 

    private String columnName; 

    private String columnComment; 

    private String SqlType;

這個關系很簡單,就這麼搞定了,用來儲存一個表資訊。

下面就是如何從資料庫讀取表資訊了。

在這裡依賴一個類DatabaseMetaData,這個對象可以從資料庫連接配接來擷取。有了它萬事大吉了,想知道什麼問它即可:

DatabaseMetaData databaseMetaData = conn.getMetaData();

        //擷取所有表

        ResultSet tableSet = databaseMetaData.getTables(null, "%", "%", new String[]{"TABLE"});

        //擷取tableName表列資訊

        ResultSet columnSet = databaseMetaData.getColumns(null, "%", tableName, "%");

上面代碼會得到兩個結果集,對照DatabaseMetaData 的文檔,我們可以通過結果集的列名來擷取想要的資訊,例如

    String tableName = tableSet.getString("TABLE_NAME");

    String tableComment = tableSet.getString("REMARKS");

    String columnName = columnSet.getString("COLUMN_NAME");

    String columnComment = columnSet.getString("REMARKS");

    String sqlType = columnSet.getString("DATA_TYPE");

含義很清楚我就不做解釋了。

逐個周遊表,然後得到一個TableInfoBean的集合,這個集合就是資料庫中所有表的資訊了,有了這個資訊,生成xml、POJO簡直就是小兒科的事情了。

本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/90739,如需轉載請自行聯系原作者