将哈希图放入另一个集合时出现问题

发布于 2024-11-16 05:42:53 字数 7776 浏览 4 评论 0 原文

  1. 在下面的代码中,子哈希图在循环内打印时显示正确的值,但是当父哈希图在循环外打印时,子哈希图显示的映射仅包含最后一个条目的值覆盖所有值。

     public voidcompareOracleMySQLData() 抛出 SQLException {
        String inputTableName = ConfigurationManager.getProperty("table_name");
    
        整数 i = 0;
        整数 j = 0;
        int 列计数 = 0;
        int oracleRowCount = 0;
        int mysqlRowCount = 0;
        字符串primaryKeyIni = null;
        字符串appendStuff = null;
        连接 conO = DBManager.openDbConnection("mysql");
        连接 conM = DBManager.openDbConnection("mysql");
        语句 stmtO = null;
        语句 stmtM = null;
        结果集 resultSetO = null;
        结果集 resultSetM = null;
        ArrayList<字符串> PrimaryKeyList = new ArrayList();
        迭代器 PrimaryKeyListItr = null;
        HashMap<对象,对象> oraRowDetailsMap = new HashMap();
        HashMap<字符串,对象> mysqlRowDetailsMap = new HashMap();
        映射<字符串,对象> oraRowPrimaryMap = new HashMap();
        HashMap<字符串,HashMap<字符串,对象>> mysqlRowPrimaryMap = new HashMap>();
    // 映射<字符串,对象> oraRowPrimaryMap=new HashMap();
    // 映射<字符串,对象> mysqlRowPrimaryMap=new HashMap();
        尝试 {
            if (conO != null && conM != null) {
                if (validateTableStatus(inputTableName, conO, conM)) {
                    // 检查Oracle和Mysql数据库中的表是否存在
    
                    // 为oracle创建结果集
                    stmtO = conO.createStatement(
                            结果集.TYPE_SCROLL_INSENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);
                    resultSetO = stmtO.executeQuery(DB_QUERY);
                    ResultSetMetaData rsMetaDataO = resultSetO.getMetaData();
    
                    //
    
                    // 创建的同一个表的 MySql 详细信息
                    stmtM = conM.createStatement(
                            结果集.TYPE_SCROLL_INSENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);
                    resultSetM = stmtM.executeQuery(DB_QUERY);
    
                    // 获取两个表的列数
                    ResultSetMetaData rsMetaDataM = resultSetM.getMetaData();
                    logger.debug("Oracle 表中的列数::"
                            + rsMetaDataO.getColumnCount());
                    logger.debug("Mysql 表中的列数::"
                            + rsMetaDataM.getColumnCount());
                    // 匹配两个表的列数
                    if (rsMetaDataM.getColumnCount() == rsMetaDataO
                            .getColumnCount()) {
                        logger.debug("两个表中的列数相同");
                        oracleRowCount = getRowCount(inputTableName, resultSetO);
                        mysqlRowCount = getRowCount(inputTableName, resultSetM);
                        logger.debug("Oracle 表的行数::"
                                + oracleRowCount);
                        logger.debug("Mysql 表的行数::"
                                + mysqlRowCount);
                        if (oracleRowCount != mysqlRowCount) {
                            记录器
                                    .debug("Oracle和Mysql表的行数分别不同");
    
                        }
    
    
    
                        别的 {
                            PrimaryKeyList = getPrimaryKey(inputTableName, conO);
    
                            while (resultSetO.next()) {
    
                                我 = 0;
                                PrimaryKeyListItr = PrimaryKeyList.iterator();
                                while (primaryKeyListItr.hasNext()) {
    
                                    如果(我==0){
                                        PrimaryKeyIni = (结果集O
                                                .getObject(primaryKeyListItr)
                                                        .next().toString()))
                                                .toString().trim();
    
    
                                    } 别的 {
                                        追加内容 = (结果集O
                                                .getObject(primaryKeyListItr)
                                                        .next().toString()))
                                                .toString().trim();
                                        PrimaryKeyIni = PrimaryKeyIni + "$"
                                                + 追加内容;
    
                                    }
                                    我++;
    
                                }
    
                                // 
    
                                colCount = rsMetaDataO.getColumnCount();
                                for (j = 1; j <= colCount; j++) {
                                    System.out.println("列名称"+rsMetaDataO
                                            .getColumnName(j));
                                    System.out.println("列值"+ resultSetO
                                            .getObject(rsMetaDataO)
                                                    .getColumnName(j)));
                                    oraRowDetailsMap.put(rsMetaDataO
                                            .getColumnName(j), 结果集O
                                            .getObject(rsMetaDataO)
                                                    .getColumnName(j)));
                                }
                                  System.out.println("primaryKeyIni"+primaryKeyIni);
                                System.out.println("循环内的oraRowDetailsMap"+oraRowDetailsMap);
                                oraRowPrimaryMap.put(primaryKeyIni,
                                        oraRowDetailsMap);
      }
       System.out.println("oraRowDetailsMap"+oraRowDetailsMap);System.out.println(oraRowPrimaryMap);
    
                }
    
                    } 别的 {
                        logger.debug("Oracle和Mysql表的列数不同");
                    }
    
                }
            }
        }
    
        catch (SQLException e) {
            logger.debug("CompareOracleMySQLData() 中出错" + e.getMessage());
        } catch (异常 e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } 最后 {
            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}}
  1. In the below code the child hashmap when printed within loop shows correct value but when the parent hashmap is printed outside the loop the child hashmap is showing a map with only the values of last entry overiding all the values.

        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.The output is below ::

                      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}}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

热鲨 2024-11-23 05:42:53

您只需为每一行重复使用相同的 oraRowDetailsMap 即可。难怪你的结果中一遍又一遍地出现相同的地图。

使用地图<...> oraRowDetailsMap = new HashMap<...>(); 在结果集循环中为每行创建一个新映射,而不是在循环之前仅创建一次。

You are simply reusing the same oraRowDetailsMap for each row. No wonder you have the same map over and over in your result.

Use a Map<...> oraRowDetailsMap = new HashMap<...>(); inside your result set loop to create a new map for each row, instead of only once before the loop.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文