Java - ArrayList只返回数据库中的一个值

时间:2018-05-28 01:58:07

标签: java spring

我正在尝试创建一个API,它将以json格式响应数据库中的所有数据。我已经成功创建了这个API并设法从中获取一些数据。我担心的是,当我调用API时,数据只返回数据库的最后一行。

当我在listobj中添加 plancode 之前记录 plancode 时,plancode会返回数据库中的所有数据。但每当我返回 listobj 时,它只返回数据库中的最后一行。谢谢您的帮助!

这是我使用的代码。

        public ArrayList<HashMap<String, Object>> PlanCodesdb(String dbip,int dbport, String dbname, String dbuser,String dbpwd) throws SQLException, JSONException{
        PreparedStatement ps = null;
        ResultSet rs = null;
        Connection conn = null;
        StringBuilder str = new StringBuilder();
        String procname = "PlanCodes";
        String loggerLabel = procname + "-" +  dbip + "-" + dbname;

        str.append("SELECT brand, product_type, load_package, keyword, denomination, list_price AS wallet_cost, validity FROM plan_code_tbl");
        com.mysql.jdbc.jdbc2.optional.MysqlDataSource ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource();

        ds.setServerName(dbip);
        ds.setPortNumber(dbport);
        ds.setDatabaseName(dbname);
        ds.setUser(dbuser);
        ds.setPassword(dbpwd);
        conn = ds.getConnection();
        ps = conn.prepareStatement(str.toString());
        rs = ps.executeQuery();
        ArrayList<HashMap<String, Object>> listobj = new ArrayList<HashMap<String, Object>>();
        rs = ps.getResultSet();
        ResultSetMetaData metadata =  rs.getMetaData();
        ArrayList<String> key = new ArrayList<String>();
        // System.out.println("column counts: "+metadata.getColumnCount());
        logger.info("COlumn counts: " + metadata.getColumnCount());
        for (int i=1; i <= metadata.getColumnCount(); i ++){
            String columname = metadata.getColumnLabel(i);
//          logger.info(loggerLabel + "plancode columnname = " + columname); 
            //  System.out.println("key:"+columname);
            key.add(columname);
        }
        HashMap<String,Object> plancodes = new HashMap<String,Object>();
        while(rs.next()){
            for (String columname : key){                                           
                try{
                    String colVal = rs.getString(columname);
//                      logger.info("columname: "+columname+" colVal:"+colVal);
                    plancodes.put(columname, colVal);
                }catch(Exception e){
                    e.printStackTrace();
                    logger.info(loggerLabel + "Error Exception: "+e);
                }
            }
            listobj.add(plancodes);
//          logger.info("plan code response..."); 
            // logger.info("brand: "+bean.getBrand()+ "\n product_type: "+ bean.getProductType() + "\n load_package: "+ bean.getLoadPackage() +"\n keyword: "+bean.getKeyword()+"\n denomination: "+bean.getDenomination()+"\n list_price: "+bean.getListPrice()+"\n retailer discount: "+bean.getRetailerDiscount()+"\n validity: "+bean.getValidity());        
        }
        return listobj;
    }

2 个答案:

答案 0 :(得分:0)

您正在使用Map Key作为&#39; String&#39;在你的地图中,键是'columname&#39;。所有行的列名都相同。因此,在每次迭代时,您的映射将使用下一个键(即列名和值)替换现有键。这就是为什么你只在列表中获得一行。 所以不要使用字符串作为地图密钥。使用一些独特的值来避免这些问题。 例如:

>> paragraph._element.tag
 '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}p'

>> p.tag
 'CT_OMathPara'

在地图结果中,您只能找到两个记录,即cde 2和abc 3 。因为当你添加相同的字符串键abc两次。它将被最新的替换。 希望它能回答你的问题。祝你好运!

答案 1 :(得分:0)

HashMap<String,Object> plancodes = new HashMap<String,Object>();
while(rs.next()){
    for (String columname : key){                                           
        try{
            String colVal = rs.getString(columname);
            // logger.info("columname: "+columname+" colVal:"+colVal);
            plancodes.put(columname, colVal);
        }catch(Exception e){
            e.printStackTrace();
            logger.info(loggerLabel + "Error Exception: "+e);
        }
    }
    listobj.add(plancodes);
    // logger.info("plan code response..."); 
    // logger.info("brand: "+bean.getBrand()+ "\n product_type: "+ bean.getProductType() + "\n load_package: "+ bean.getLoadPackage() +"\n keyword: "+bean.getKeyword()+"\n denomination: "+bean.getDenomination()+"\n list_price: "+bean.getListPrice()+"\n retailer discount: "+bean.getRetailerDiscount()+"\n validity: "+bean.getValidity());        
}

问题是您不断更新相同的Map并将其添加到列表中。您需要在Map循环中创建<{1}}

while

以便列表中的每个元素都是新的while(rs.next()){ HashMap<String,Object> plancodes = new HashMap<String,Object>();