使用Spring JdbcTemplate提取一个字符串

时间:2015-03-26 18:58:27

标签: java sql hsqldb jdbctemplate

似乎找不到使用JdbcTemplate查询从表中获取一个字符串的方法。 这是我的sql返回的表:

ID | STREET_NAME
------------------------
1  | Elm street

现在我应该如何获得STREET_NAME的价值。 SQL总是返回一行,因此无需担心返回多行。

有关背景信息: INNER JOIN and COUNT in the same query

使用Tony Stark回答我的桌子。

但是如何使用JdbcTemplate从中提取“Elm street”?

3 个答案:

答案 0 :(得分:26)

了解SQL查询的内容会有很多帮助,但假设它类似于SELECT ID,STREET_NAME FROM table WHERE ID=1;

代码:

public String getStreetNameById(int id) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    String sql = "SELECT ID,STREET_NAME FROM table WHERE ID=?";

    String streetName = (String) jdbcTemplate.queryForObject(
            sql, new Object[] { id }, String.class);

    return streetName;
}

答案 1 :(得分:4)

如果您只想从表中获取一个“string”列(或任何带有连接的查询),则必须说明该列的名称。

顺便说一句,使用 SELECT * FROM TABLE 是一种非常糟糕的做法。我打赌你这样做了。

@JLewkovich修改代码:

public String getStreetNameById(int id) {
  JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  String sql = "SELECT STREET_NAME FROM table WHERE ID=?";

  String streetName = (String) jdbcTemplate.queryForObject(
        sql, new Object[] { id }, String.class);

  return streetName;
}

但如果有0个或多个结果怎么办? 想一想!

但是要获得一个序列值(在Oracle中),这应该可行。

public Long getSequence() {
  Long seq;
  String sql = "select SEQ_XY.NEXTVAL from dual";
  seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
  return seq;
}

答案 2 :(得分:0)

我通常这样做:

String result = DataAccessUtils.singleResult(
    jdbcTemplate.queryForList(
        "SELECT street_name FROM table WHERE id = :id",
        Collections.singletonMap("id", id),
        String.class
    )
)
使用

queryForList 代替 queryForObject 处理空结果。 queryForObject 会为空结果抛出EmptyResultDataAccessException。通常这不是您想要的行为。

DataAccessUtils.singleResult + queryForList

  • 为空结果返回null
  • 如果仅找到1行,则返回单个结果
  • 如果发现多于1行,则
  • 引发异常。主键/唯一索引搜索不应该发生

DataAccessUtils.singleResult