1

我有以下类用于从特定模式的所有 MySQL 表中获取所有行记录:

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()throughpublic static void main class时,我得到的结果是包含来自所有表的所有行数据的列表存在于特定模式中。我的目的是将每个表中的所有行记录(一个接一个)与每个表中属于另一个模式的所有记录进行比较。如何指定 my arraylistwhich 引用每个表的所有记录?现在,当您意识到我将所有表中的所有记录合二为一时arraylist,我想将它们分开,以便我的搜索变得更加容易。

亲爱的罗宾格林,我已经有了您在回答中建议的“四个级别”。虽然我想成功的比较比较复杂。实际上,我想将第一个数据库的 X 列的每一行与第二个数据库的 Z 列的每一行进行比较,其中 X 列和 Z 列具有相同的数据类型。将 int 类型列的行与 varchar 列的所有行进行比较是没有意义的。此外,我想确定的不仅仅是简单的行数。我想决定当一行描述同一个对象时,另一行属于不同的数据库表,并且两行可能并不完全相等。例如,我有一行值:“Robin”(姓名)、“220000”(id)、“99800000”(电话)和一行值:“Robyn”(姓名)、“220000”(id)、“ 97677999" (电话)。我们说的是同一个人,即使名字和电话不同。在我澄清后,请给我你的想法和建议。

预先感谢。

4

1 回答 1

1

正如您所认识到的,您的数据结构设计过于扁平 - 您有两个级别:

ArrayList -> 单元格值

实际上你应该有四个级别

ArrayList -> 表 -> 行 -> CellValue

所以你应该创建一些类表和行。

但是,重新设计应用程序可能更有效,以便它遍历来自两个查询的结果集,并逐行比较它们,这样您就不必将来自两个完整模式的所有数据存储在内存中。

此外,已经存在数据库差异工具;也许您应该只使用其中之一?

于 2013-10-27T13:59:07.847 回答