ResultSetMetaData注意事項

ResultSetMetaData作用

ResultSetMetaData是做什麼用的呢,剛接觸jdbc的朋友可能不知道他能夠做些什麼事情。它能夠幫我們動態獲取結果集中的字段數量,字段的名稱,字段的類型等信息。JDBC的ResultSet大家總知道吧。可以通過下面的語句得到ResultSetMetaData的對象:

ResultSetMetaData的更多接口信息可以看JDK安裝目錄下的rt.jar包中的java.sql.ResultSetMetaData接口聲明

ResultSet rs = //查詢出的結果集
ResultSetMetaData metaData = rs.getMetaData()

在工作中需要獲取到返回結果中每一個字段的歸屬,即這個字段是屬於哪個表的。因爲在有些情況下兩個不同的表裏面可能會有兩個相同的字段名稱。查看ResultSetMetaData的接口聲明發現裏面有兩個方法:

/**
     * Gets the designated column's suggested title for use in printouts and
     * displays. The suggested title is usually specified by the SQL <code>AS</code>
     * clause.  If a SQL <code>AS</code> is not specified, the value returned from
     * <code>getColumnLabel</code> will be the same as the value returned by the
     * <code>getColumnName</code> method.
     *
     * @param column the first column is 1, the second is 2, ...
     * @return the suggested column title
     * @exception SQLException if a database access error occurs
     */
    String getColumnLabel(int column) throws SQLException;
    /**
     * Get the designated column's name.
     *
     * @param column the first column is 1, the second is 2, ...
     * @return column name
     * @exception SQLException if a database access error occurs
     */
    String getColumnName(int column) throws SQLException;

那能否用這兩個方法去獲取我所想要的呢,通過代碼去獲取發現獲得到的值是空的。那就去找資料爲什麼會是空的呢,發現JDBC規範中有一個參數控制做這個的值,這個參數就是:ResultSetMetaDataOptions,它的默認值是0,應該設置爲1才能使我們想要的功能生效。在創建JDBC連接的時候有如下的一個創建方法,可以設置JDBC的參數:

public static Connection getConnection(String url,
        java.util.Properties info) throws SQLException {

那怎麼使用呢?大家可以像下面這樣使用,我們的用戶名,密碼都可以放到這裏面:

java.util.Properties info = new java.util.Properties();
info.put("user", cfg.getUser());
info.put("password", cfg.getPassword());
Connection connection = DriverManager.getConnection(cfg.getUrl(), info);

OK,到此,已經設置完畢了,我應該能夠拿到我所想要的值了吧,可最後發現還是取不了,那到底是什麼原因呢?繼續找資料,沒有任何有幫助的資料,最後找到別人的一個回覆才發現是JDBC驅動並沒有去實現這個接口。說好多的數據庫的JDBC都沒有實現。到此就不繼續往下了,有時間了之後再去驗證網友的說法。

getColumnName與getColumnLabel的總結

前面講到了如果我們想要獲取到返回結果中的列的名稱,可以使用到這兩個結構,看接口中的解釋知道getColumnLabel()獲取到到是字段的別名,如果沒有別名就和實際的列的別名一致。而getColumnName()是獲取真正的列名的。

這裏爲什麼單獨拿出來說這一點,是因爲不是所有的數據庫的JDBC驅動都是一樣的,自身我自己親自測試過的Oracl的JDBC驅動這兩個方法取出來的值都是一樣的。如果有別名,取出來的都是別名,取不到真實的名稱。看到網上有網友測試過SQLServer數據庫的JDBC,發現也是一樣的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章