使用Spring JdbcTemplate 提取一个字符串

Using Spring JdbcTemplate to extract one string

似乎无法找到使用 JdbcTemplate 查询从 table 获取一个字符串的方法。 这是 table 我的 sql returns:

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

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

一些背景信息:

使用 Tony Stark 的答案得到我的 table。

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

了解您的 SQL 查询是什么样的会很有帮助,但假设它类似于 SELECT STREET_NAME FROM table WHERE ID=1;

代码:

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;
}

如果您只想从 table 中获取一列 "string"(或任何具有连接的查询),您必须说出该列的名称。

顺便说一下,使用 SELECT * FROM TABLE 是一种 very-very 不好的做法。我打赌你做到了。

@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;
}

我通常这样做:

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:

  • returns 空结果为 null
  • returns 如果恰好找到 1 行,则为单个结果
  • 如果找到超过 1 行,则抛出异常。主键/唯一索引搜索不应该发生

DataAccessUtils.singleResult

根据最新规范 queryForObject,现在 已弃用

<T> T   queryForObject(String sql, Object[] args, Class<T> requiredType)

新方法使用 varargs.

<T> T   queryForObject(String sql, Class<T> requiredType, Object... args) 

更新的解决方案:我们必须用 Object args 替换 class 类型,反之亦然。

Sql 查询:SELECT STREET_NAME FROM table WHERE ID=1;

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, String.class, new Object[] { id });

    return streetName;
}

class JdbcTemplate implements JdbcOperations.

如果您查看 JdbcOperations 中的 queryForObject javadoc,它指出:

Deprecated. as of 5.3, in favor of queryForObject(String, Class, Object...)

基本上,他们更改了方法签名以摆脱方法签名中的 Object[] 参数,转而支持可变参数。请参阅相关 Github issue.

您可以像这样使用新方法签名重写@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, String.class, id);

    return streetName;
}