2013-10-27 60 views
1

我有以下類是使用了追趕從所有的MySQL表中的所有行記錄一個特定的模式:如何以離散的ArrayList元素

public void GetAllDataDB1() // Catching all the data from "bank1" database 
{ 
    try 
    { 
     MetaData1 = connection1.getMetaData(); 
     catalogs1 = MetaData1.getCatalogs(); 
     String[] types = {"TABLE"}; 
     resTables1 = MetaData1.getTables(null,null,"%",types); 

     while (resTables1.next()) 
     { 
      db1TableName = resTables1.getString("TABLE_NAME"); 
      resTablesStr1 = statement1.executeQuery("SELECT * FROM "+db1TableName+";");  
      resColumns1 = resTablesStr1.getMetaData(); 
      db1TotalColNum = resColumns1.getColumnCount(); 
      db1FirstColName = resColumns1.getColumnName(1); 
      //Object k = resTablesStr1.getObject(db1FirstColName); 
      //System.out.println("| "+k.toString()+" |"); 

      for (int i=1; i<=db1TotalColNum; i++) 
      { 
       db1CurColNum = i; 
       db1ColName = resColumns1.getColumnName(i); 
       db1ColDataType = resColumns1.getColumnTypeName(i); 
       resTablesData1 = statement1.executeQuery("SELECT "+db1ColName+" FROM "+db1TableName+" GROUP BY "+db1FirstColName+";"); 

       resTablesData1.last(); 
       db1TotalRowNum = resTablesData1.getRow(); 
       resTablesData1.beforeFirst(); 

       db1CurRowNum = 0; 
       while (resTablesData1.next()) 
       { 
        db1CurRowNum++;   
        ObjRowValues = resTablesData1.getObject(db1ColName); 
        rows.add(new CellValue(db1TableName,db1ColName,db1CurColNum,db1CurRowNum,db1ColDataType,ObjRowValues.toString())); 
       } 
       //cells.add(row); 
      } 
     } 
     for (CellValue r : rows) 
     { 
      System.out.println("TABLE: " + r.getTable() +" "+"COLUMN: " + r.getColumn() +" "+"COLUMN_ID: " + r.getcolID() +" "+"ROWD_ID: " + r.getrowID() +" "+"COLUMN_TYPE: " + r.getcellType()+" "+"ROW_VALUE: " + r.getcellValue()); 
     } 
    } 
    catch (SQLException e) 
    { 
     System.err.println("Connection Failed! Check output console " + e.getMessage()); 
     System.exit(0); 
} 
} 

CellValue類如下:

public class CellValue 
{ 
    String tab; 
    String col; 
    int colID; 
    int rowID; 
    String cellType; 
    String cellValue; 

    public CellValue(String tab, String col, int colID, int rowID, String cellType, String cellValue) 
    { 
     this.tab = tab; 
     this.col = col; 
     this.colID = colID; 
     this.rowID = rowID; 
     this.cellType = cellType; 
     this.cellValue = cellValue; 
    } 

    public String getTable() 
    { 
     return this.tab; 
    } 

    public String getColumn() 
    { 
     return this.col; 
    } 

    public int getcolID() 
    { 
     return this.colID; 
    } 

    public int getrowID() 
    { 
     return this.rowID; 
    } 

    public String getcellType() 
    { 
     return this.cellType; 
    } 

    public String getcellValue() 
    { 
     return this.cellValue; 
    } 
} 

當我執行GetAllDataDB1()public static void main class時,我得到的結果是列表,其中包含來自特定模式中存在的所有表的所有行數據。我的目的是比較每個表(每個表中的所有行記錄)與每個表中的所有記錄屬於另一個模式。我如何指定我的arraylist中引用每個表的所有記錄?現在你意識到我有一個arraylist中的所有表中的所有記錄,我想將它們分開,這樣我的搜索變得更加容易。

尊敬的羅賓格林, 我已經有了「四個級別」的建議你的答案。雖然我想成功的比較更復雜。實際上,我想比較第一個數據庫的第X列的每一行與第二個數據庫的列Z的每一行,其中列X和列Z具有相同的數據類型。將int類型的列的行與varchar列的所有行進行比較沒有任何意義。更進一步,我想確定一些比行簡單的等於多。我想決定何時一行描述同一個對象,而另一行屬於另一個數據庫的表,並且可能兩行都不完全等於。例如,我有一個值爲「Robin」(名稱),「220000」(id),「99800000」(phone)和值爲「Robyn」(名稱),「220000」(id),「 97677999" (電話)。我們在談論同一個人,甚至名字和電話都不一樣。在我澄清之後,請給我你的想法和建議。

提前致謝。

+1

你應該考慮重新設計你的搜索方法,因爲根據表的大小,你很可能會在某個時間點出現heappace問題 –

回答

1

你的數據結構設計,因爲你已經認識到,過於平坦 - 你有兩個層次:

的ArrayList - > CellValue

時候,其實你真的應該有四個層次

的ArrayList - >表格 - >行 - > CellValue

所以你應該創建一些類表和行。

然而,它可能是更有效的重新設計應用程序,使其通過從兩個查詢結果集的迭代,並比較他們逐行,讓你不必將所有的數據從兩個整店做記憶中的模式。

另外,有數據庫差異工具已經存在;也許你應該只使用其中之一?