在下面的代码中,子循环映射在循环中打印时显示正确的值,但是当在循环外打印父散列映射时,子散列映射显示的映射只包含覆盖所有值的最后一个条目的值。
public void compareOracleMySQLData() throws SQLException {
String inputTableName = ConfigurationManager.getProperty("table_name");
int i = 0;
int j = 0;
int colCount = 0;
int oracleRowCount = 0;
int mysqlRowCount = 0;
String primaryKeyIni = null;
String appendStuff = null;
Connection conO = DBManager.openDbConnection("mysql");
Connection conM = DBManager.openDbConnection("mysql");
Statement stmtO = null;
Statement stmtM = null;
ResultSet resultSetO = null;
ResultSet resultSetM = null;
ArrayList<String> primaryKeyList = new ArrayList<String>();
Iterator<String> primaryKeyListItr = null;
HashMap<Object, Object> oraRowDetailsMap = new HashMap<Object, Object>();
HashMap<String, Object> mysqlRowDetailsMap = new HashMap<String, Object>();
Map<String, Object> oraRowPrimaryMap = new HashMap<String, Object>();
HashMap<String, HashMap<String, Object>> mysqlRowPrimaryMap = new HashMap<String, HashMap<String, Object>>();
// Map<String, Object> oraRowPrimaryMap=new HashMap<String, Object>();
// Map<String, Object> mysqlRowPrimaryMap=new HashMap<String, Object>();
try {
if (conO != null && conM != null) {
if (validateTableStatus(inputTableName, conO, conM)) {
// Check table existence in Oracle and Mysql Database
// Create resultset for oracle
stmtO = conO.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
resultSetO = stmtO.executeQuery(DB_QUERY);
ResultSetMetaData rsMetaDataO = resultSetO.getMetaData();
//
// MySql details for the same table created
stmtM = conM.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
resultSetM = stmtM.executeQuery(DB_QUERY);
// Get Column Count for two tables
ResultSetMetaData rsMetaDataM = resultSetM.getMetaData();
logger.debug("Column Count in Oracle table ::"
+ rsMetaDataO.getColumnCount());
logger.debug("Column Count in Mysql table ::"
+ rsMetaDataM.getColumnCount());
// Match Column count of two tables
if (rsMetaDataM.getColumnCount() == rsMetaDataO
.getColumnCount()) {
logger.debug("The Column count in both table are same");
oracleRowCount = getRowCount(inputTableName, resultSetO);
mysqlRowCount = getRowCount(inputTableName, resultSetM);
logger.debug("No of Rows of Oracle Table :: "
+ oracleRowCount);
logger.debug("No of Rows of Mysql Table :: "
+ mysqlRowCount);
if (oracleRowCount != mysqlRowCount) {
logger
.debug("The number of rows of Oracle and Mysql tables respectively differs");
}
else {
primaryKeyList = getPrimaryKey(inputTableName, conO);
while (resultSetO.next()) {
i = 0;
primaryKeyListItr = primaryKeyList.iterator();
while (primaryKeyListItr.hasNext()) {
if (i == 0) {
primaryKeyIni = (resultSetO
.getObject(primaryKeyListItr
.next().toString()))
.toString().trim();
} else {
appendStuff = (resultSetO
.getObject(primaryKeyListItr
.next().toString()))
.toString().trim();
primaryKeyIni = primaryKeyIni + "$"
+ appendStuff;
}
i++;
}
//
colCount = rsMetaDataO.getColumnCount();
for (j = 1; j <= colCount; j++) {
System.out.println("Col Name"+rsMetaDataO
.getColumnName(j));
System.out.println("Col Value"+ resultSetO
.getObject(rsMetaDataO
.getColumnName(j)));
oraRowDetailsMap.put(rsMetaDataO
.getColumnName(j), resultSetO
.getObject(rsMetaDataO
.getColumnName(j)));
}
System.out.println("primaryKeyIni"+primaryKeyIni);
System.out.println("oraRowDetailsMap inside loop"+oraRowDetailsMap);
oraRowPrimaryMap.put(primaryKeyIni,
oraRowDetailsMap);
}
System.out.println("oraRowDetailsMap"+oraRowDetailsMap);System.out.println(oraRowPrimaryMap);
}
} else {
logger.debug("The number of Columns of Oracle and Mysql table differs");
}
}
}
}
catch (SQLException e) {
logger.debug("Error in CompareOracleMySQLData()" + e.getMessage());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBManager.closeConnection(conO);
DBManager.closeConnection(conM);
DBManager.closeStatement(stmtO);
DBManager.closeStatement(stmtM);
DBManager.closeResultSet(resultSetO);
DBManager.closeResultSet(resultSetM);}}
2.输出低于::
DEPLOYMENT_LEVEL is: DVL
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to MYSQL database established
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to MYSQL database established
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Oracle table ::4
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Mysql table ::4
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - The Column count in both table are same
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Oracle Table :: 3
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Mysql Table :: 3
Col NameFirst_Name
Col Valuefn
Col NameLast_Name
Col Valueln
Col NameAddress
Col Valueadr
Col NameCity
Col Valuecity
primaryKeyInifn$ln
oraRowDetailsMap inside loop{Address=adr, Last_Name=ln, First_Name=fn, City=city}
Col NameFirst_Name
Col Valuefn1
Col NameLast_Name
Col Valueln1
Col NameAddress
Col Valueadr1
Col NameCity
Col Valuecity1
primaryKeyInifn1$ln1
oraRowDetailsMap inside loop{Address=adr1, Last_Name=ln1, First_Name=fn1, City=city1}
Col NameFirst_Name
Col Valuefn3
Col NameLast_Name
Col Valueln3
Col NameAddress
Col Valueadr3
Col NameCity
Col Valuecity3
primaryKeyInifn3$ln3
oraRowDetailsMap inside loop{Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}
oraRowPrimaryMap{fn3$ln3={Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}, fn$ln={Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}, fn1$ln1= {Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}}
答案 0 :(得分:0)
您只是为每一行重复使用相同的oraRowDetailsMap
。难怪你在结果中反复使用相同的地图。
在结果集循环中使用Map<...> oraRowDetailsMap = new HashMap<...>();
为每一行创建一个新地图,而不是在循环之前只创建一次。