Spring JdbcTemplate提供的queryForMap()和queryForList()方法究竟是如何在内部工作的?

时间:2014-12-14 17:32:48

标签: java spring spring-jdbc jdbctemplate

我正在攻读Spring Core认证,我对使用 JdbcTemplate 有一些疑问。

我知道JdbcTemplate为我提供了不同的方法来执行查询(用SQL编写)。

所以我有以下方法:

1) queryForObject()

public long getPersonCount() {
    String sql = “select count(*) from PERSON”;
    return jdbcTemplate.queryForObject(sql, Long.class);
}

因此,在此方法中,我指定了2个参数,分别表示返回对象的SQL语句和类型。在前一种情况下,指定将查询结果返回到 Long 对象。

如果查询返回的结果与指定的类型不匹配,会发生什么? (例如,如果查询返回一个String并且我已经指定了一个Long作为queryForObject()方法的参数?这样的情况如何处理?

2) queryForMap()

public Map getPersonInfo(int id) {
    String sql = “select * from PERSON where id=?”;
    return jdbcTemplate.queryForMap(sql, id);
}

在我看来,只有当我的查询返回单行时才会使用此文档。这是对的吗?

所以现在我怀疑是否使用了 queryForMap()方法。

我知道 Map 界面使用 系统存储对象。

因此,地图被认为会存储多个 对。所以我认为这可以存储多行:Map的键是我表的一行的键,值包含其他列的值(到对象中)。

但似乎 queryForMap()方法的逻辑非常不同。它是如何工作的?

也许它会返回一个以这种方式工作的地图:

:包含表的主键的键,并且与此键关联的多个值与我表的其他字段的内容相关。或者是什么?

3) queryForList()

public List getAllPersonInfo() {
    String sql = “select * from PERSON”;
    return jdbcTemplate.queryForList(sql);
}

在我看来,当我希望我的查询返回多行时,会使用它来阅读文档。在我看来,方法输出是一个 Map的列表(所以根据前面的方法,每个Map代表一个返回的行**(但前面有关行如何存储到一个行中的疑问)地图仍然存在)。

你能帮助我深入了解这些方法是如何运作的吗?

TNX

2 个答案:

答案 0 :(得分:9)

  1. 你会得到一个例外。你可以简单地写一个测试来确认它。
  2. 该方法的文档说:该查询应该是单行查询,所以是的,该查询应该返回一行。它还说:返回:结果Map(每列的一个条目,使用列名作为键),这应该清除你的疑虑并反驳你的错误假设。
  3. 文档说:结果将映射到地图的列表(每行一个条目)(每列使用列名作为键的一个条目),再次应该足以清除你的疑虑并反驳你错误的假设。

答案 1 :(得分:0)

获取包含每行地图的行列表:

List<Map<String, Object>> rsMapList = jdbcTemplate.queryForList(sql, params);