spring jdbctemplate 在映射键中保存数据是字符串和值对象
Posted
技术标签:
【中文标题】spring jdbctemplate 在映射键中保存数据是字符串和值对象【英文标题】:spring jdbctemplate hold data in map key is string and value Object 【发布时间】:2014-02-24 16:48:36 【问题描述】:您好需要保存结果集,因为键值对键是来自数据库的字符串 并且有多个值对应于键值也来自数据库 地图看起来像这样 Map>
我的代码是:
它是结果集提取器:在此我正在迭代结果集并将其添加到地图中。
ResultSetExtractor resultExtractor = new ResultSetExtractor()
public Object extractData(ResultSet rs) throws SQLException,
DataAccessException
MyDataBean dataBean = new MyDataBean();
List<MyDataBean > myDataBeanList = new ArrayList<MyDataBean >();
Map<String, List<MyBean>> myMap = new HashMap<String, List<MyDataBean>>();
while (rs.next())
String propertyNumber = rs.getString("PROPERTY_NUMBER");
dataBean.setAccountNumber(rs.getLong("ACCOUNT_NUMBER"));
dataBean.setAmount(rs.getDouble("AMOUNT"));
myDataBeanList .add(dataBean);
myMap .put(propertyNumber, argusDataList);
return myMap ;
;
这是method::: 在这里我触发查询并传递resultExtractor。
@SuppressWarnings("unchecked")
public Map<String, List<MyDataBean>> getData()
throws DataAccessException, GeneralFailureException
Map<String, List<MyDataBean>> myMap= null;
try
myMap= jdbcTemplate.query(MyQuery,
resultExtractor );
catch (DataAccessException ex)
throw new GeneralFailureException("SQL Exception:xyzClass::"
+ ex);
catch (Exception ex)
throw new GeneralFailureException(
"GeneralFailureException::xyzClass::::" + ex);
return myMap;
在结果集提取器中,我将数据保存在地图中,但在输出中,它给出了地图的所有键,但只有添加到列表中的最后一个值 m 不明白为什么请帮我解决这个问题
提前致谢
【问题讨论】:
您是否真的得到了多个结果,以至于您的迭代得到了多行? Namaste Prashant。问题中的argusDataList
变量是什么?
抱歉 ATG 我忘了把它重命名为 myDataBeanList
【参考方案1】:
我希望我明白这一点。 如果您有多个与该键对应的值,我建议您修改代码,如下所示。在 map 中,如果您尝试插入一个已经存在的键,它将替换旧值。
public Object extractData(ResultSet rs) throws SQLException//, DataAccessException
MyDataBean dataBean = new MyDataBean();
List<MyDataBean > myDataBeanList = new ArrayList<MyDataBean >();
Map<String, List<MyDataBean>> myMap = new HashMap<String, List<MyDataBean>>();
while (rs.next())
String propertyNumber = rs.getString("PROPERTY_NUMBER");
dataBean.setAccountNumber(rs.getLong("ACCOUNT_NUMBER"));
dataBean.setAmount(rs.getDouble("AMOUNT"));
if (myMap.containsKey(propertyNumber) )
myMap .get(propertyNumber).add(dataBean);
else
myDataBeanList .add(dataBean);
myMap.put(propertyNumber, myDataBeanList) ;
return myMap ;
【讨论】:
【参考方案2】:如果我正确理解您的问题,您正试图从ResultSet
中提取数据,并将其映射到从每个属性编号到其相应帐户信息列表的映射中。因此,属性编号和帐户之间存在一对多的关系。
我认为您只会得到一个结果,因为当您调用 myMap.put(propertyNumber, list)
而不是附加到现有列表时,您正在覆盖前一个属性编号的键。如果您查看 java.util.Map
上“put(key, value)”的 Javadoc,它解释说映射中与指定键匹配的任何现有键的值都将替换为新值。
因此,您需要使用以下方式检查地图中是否存在房产编号:
if (!myMap.containsKey(propertyNumber))
myMap.put(propertyNumber, new ArrayList<MyDataBean>());
List<MyDataBean> myDataBeanList = myMap.get(propertyNumber);
// continue constructing new MyDataBean using the current row of the ResultSet
我还认为您需要缩小 myDataBean
变量的范围,使其位于 while (rs.next())
循环内,以确保您获得每个帐号和金额的不同实例。
【讨论】:
以上是关于spring jdbctemplate 在映射键中保存数据是字符串和值对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Boot 中的 Yaml 中转义 Map 键中的点
Spring Boot 和 JDBCTemplate简介: JDBC Template