我有以下类用于从特定模式的所有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()
到public static void main class
时,我得到的结果是列表,其中包含特定模式中存在的所有表中的所有行数据。我的目的是比较每个表中的所有行记录(逐个),每个表中的所有记录都属于另一个模式。如何指定arraylist
引用每个表的所有记录?现在,当您意识到我在一个arraylist
中拥有所有表中的所有记录时,我想将它们分开,以便我的搜索变得更加容易。
亲爱的罗宾格林, 当你在答案中提出建议时,我已经有了“四级”。虽然我想要成功的比较更复杂。实际上我想比较第一个数据库的第X列的每一行和第二个数据库的第Z列的每一行,其中第X列和第Z列具有相同的数据类型。将int类型列的行与varchar列的所有行进行比较没有任何意义。还有更多我想要确定的不仅仅是简单的行等。我想决定一行描述同一个对象,另一行属于另一个数据库的表,可能两行都不完全相等。例如,我有一行值:“Robin”(名称),“220000”(id),“99800000”(电话)和一行值:“Robyn”(姓名),“220000”(id),“ 97677999" (电话)。我们正在谈论同一个人甚至姓名和电话都不同。在澄清之后,请告诉我您的想法和意见。
提前感谢。
答案 0 :(得分:1)
您已经认识到,您的数据结构设计过于平坦 - 您有两个级别:
ArrayList - &gt; CellValue
实际上你应该有四个级别
ArrayList - &gt;表 - &gt;行 - &gt; CellValue
所以你应该创建一些类Table和Row。
然而,重新设计应用程序可能更有效,以便它从两个查询中迭代结果集,并逐行比较它们,这样您就不必存储所有来自内存中两个完整模式的数据。
此外,已存在数据库差异工具;也许你应该只使用其中一个?