我正在尝试创建一个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;
}
答案 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>();
。