跳轉到內容

Java JDBC 使用 SQLite/元資料

來自華夏公益教科書

使用元資料

[編輯 | 編輯原始碼]

在處理資料庫物件時,總會遇到需要了解資料庫結構比你編寫程式碼時所瞭解的更多的情況。資料庫表會發生變化,例如,列型別可能從日期型別更改為字串型別,或者可能新增或刪除新的列;你可能需要引用尚未構建的表,或者是在執行時構建的表。在這種情況,JDBC 的一個非常有用的方面就派上用場了:元資料介面 ResultSetMetaData 和 DatabaseMetaData。

在處理結果集時,重要的是要記住陣列是從 SQL 的角度構建的,即它們從值為 1 而不是 0 的索引開始。你還應該注意,在處理包含 0 行的表的元資料時,SqLite 和 JDBC 可能存在問題;例如,rsmd.getColumnType() 無法正常工作,而 rsmd.getColumnName() 奇妙的是可以工作的。

讓我們考慮以下基本的示例,從中我們可以知道任何任意結果集返回的列的範圍

  public int getColumnCount(ResultSet rs) {
    int iOutput = 0;
        try {
            ResultSetMetaData rsMetaData = rs.getMetaData();
            iOutput = rsMetaData.getColumnCount();
        } catch (Exception e) {
            System.out.println(e);
            return iOutput = -1;
        }
    return iOutput;
    }

因此,使用之前 Db.executeQry(java.lang.String) 包裝方法,我們可以做一些非常簡單的事情,例如

[..]
   String mySqlSelect = "SELECT * FROM some_arbitrary_table" ;
   ResultSet myRs = db.executeQry(mySqlSelect);
   int iResult = getColumnCount(myRs);
   System.out.println(iResult);

現在我們需要知道列型別……

 public int[] getType(ResultSet rs) {
        int iType[] = null;
        try {
            ResultSetMetaData rm = rs.getMetaData();
            int iArray[] = new int[rm.getColumnCount()];
            for (int ctr = 1; ctr <= iArray.length; ctr++) {
                int iVal = rm.getColumnType(ctr);
                iArray[ctr - 1] = iVal;
            }
            return iArray;
        } catch (Exception e) {
            System.out.println(e);
            return iType;
        }
    }

這將返回一個整數陣列,表示結果集中的列型別。我們可能需要將這些整數值處理為字串,因此執行此操作的另一種方法如下

  public String[] getColumnTypeArray(ResultSet rs) {
        String sArr[] = null;
        try {
            ResultSetMetaData rm = rs.getMetaData();
            String sArray[] = new String[rm.getColumnCount()];
            for (int ctr = 1; ctr <= sArray.length; ctr++) {
                String s = rm.getColumnTypeName(ctr);
                sArray[ctr - 1] = s;
            }
            return sArray;
        } catch (Exception e) {
            System.out.println(e);
            return sArr;
        }
    }

整數陣列和字串陣列之間的相關性是 java.sql.Types 類的一個方面。兩種方式都適用於程式設計目的。

因此,我們現在知道了結果集的列範圍及其資料型別。現在我們需要知道列名,以便我們可以引用它們。ResultSetMetaData 再次提供了答案

 public String[] getColumnNameArray(ResultSet rs) {
        String sArr[] = null;
        try {
            ResultSetMetaData rm = rs.getMetaData();
            String sArray[] = new String[rm.getColumnCount()];
            for (int ctr = 1; ctr <= sArray.length; ctr++) {
                String s = rm.getColumnName(ctr);
                sArray[ctr - 1] = s;
            }
            return sArray;
        } catch (Exception e) {
            System.out.println(e);
            return sArr;
        }
    }


因此,使用之前的 Db.executeQry 包裝方法,我們現在可以開始處理未知和/或不可預見資料庫結構

  [..]
  String mySqlSelect = "SELECT * FROM some_arbitrary_table" ;  
  ResultSet myRs = db.executeQry(mySqlSelect);  
  int iResult = getColumnCount(myRs);  
  String[] colNames = getColumnNameArray(myRs);
  String[] colTypes = getColumnTypeArray(myRs);
  for (int i=1;i<iResult;i++)
  {
     System.out.println("Column: " + i + " is " + colNames[i] + " and is type: " + colTypes[i]);
  }
華夏公益教科書