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

SpringBoot 中 jdbctemplate 的使用

将 JSON 映射到数据模型,需要从动态键中获取嵌套的电子邮件值

如何从 Scala 中的映射键中获取值的常见元素?

Spring 从入门到精通系列 11—— Spring 中的 JdbcTemplate