简体   繁体   English

使用 Spring JdbcTemplate 提取一个字符串

[英]Using Spring JdbcTemplate to extract one string

Can't seem to find a way to get one string from table using JdbcTemplate query.似乎无法找到一种使用 JdbcTemplate 查询从表中获取一个字符串的方法。 This is the table my sql returns:这是我的 sql 返回的表:

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

Now how am I supposed to get the value of STREET_NAME.现在我应该如何获得 STREET_NAME 的值。 SQL always returns one row, so no need to worry about returning more than one row. SQL 总是返回一行,所以不必担心返回多于一行。

For some background info: INNER JOIN and COUNT in the same query有关一些背景信息: 同一查询中的 INNER JOIN 和 COUNT

Using Tony Stark answer to get my table.使用 Tony Stark 的答案来获取我的桌子。

But how can I extract "Elm street" from it using JdbcTemplate?但是如何使用 JdbcTemplate 从中提取“榆树街”?

It would help a lot to know what your SQL query looks like, but assuming it's something like SELECT STREET_NAME FROM table WHERE ID=1;了解您的 SQL 查询是什么样的会SELECT STREET_NAME FROM table WHERE ID=1; ,但假设它类似于SELECT STREET_NAME FROM table WHERE ID=1;

CODE:代码:

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

If you want to get only one column "string" from your table (or any query with joins), you have to say the name of the column.如果您只想从您的表(或任何带有连接的查询)中获取一列“字符串”,您必须说出该列的名称。

Using SELECT * FROM TABLE is a very-very bad practice by the way.顺便说一下,使用SELECT * FROM TABLE是一种非常非常糟糕的做法。 I bet you did this.我打赌你这样做了。

@JLewkovich modified code: @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;
}

But what if there is 0 or more than one result?但是如果有 0 个或多个结果怎么办? Think about it!想一想!

But to getting a sequence value (in Oracle), this should work.但是要获得序列值(在 Oracle 中),这应该可行。

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

The class JdbcTemplate implements JdbcOperations . JdbcTemplate类实现了JdbcOperations

If you look at the queryForObject javadocs in JdbcOperations it states:如果你看一下queryForObject中的javadoc JdbcOperations它指出:

Deprecated .已弃用 as of 5.3, in favor of queryForObject(String, Class, Object...)从 5.3 开始,支持queryForObject(String, Class, Object...)

Basically, they have changed the method signature to get rid of Object[] arguments in the method signatures in favor of varargs.基本上,他们已经更改了方法签名以摆脱方法签名中的Object[]参数,转而使用可变参数。 Please, see the relevant Github issue .请参阅相关的Github 问题

You can rewrite answer of @jlewkovich with the new method signature like this:您可以使用新方法签名重写@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;
}

As per latest specification queryForObject with below syntax is now deprecated根据最新的规范queryForObject现在不推荐使用以下语法

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

New method uses varargs .新方法使用varargs

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

Updated Solution: We have to replace the class type with Object args and vice-versa.更新的解决方案:我们必须用 Object args 替换类类型,反之亦然。

Sql Query: SELECT STREET_NAME FROM table WHERE ID=1; 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;
}

I usually do this way:我通常这样做:

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

queryForList is used instead of queryForObject for handling empty results.使用 queryForList代替queryForObject来处理空结果。 queryForObject throws EmptyResultDataAccessException for empty results. queryForObject为空结果抛出 EmptyResultDataAccessException。 Often it is not desired behavior.通常这不是我们想要的行为。

DataAccessUtils.singleResult + queryForList : DataAccessUtils.singleResult + queryForList

  • returns null for empty result为空结果返回 null
  • returns single result if exactly 1 row found如果恰好找到 1 行,则返回单个结果
  • throws exception if more then 1 rows found.如果找到多于 1 行,则抛出异常。 Should not happen for primary key / unique index search主键/唯一索引搜索不应该发生

DataAccessUtils.singleResult DataAccessUtils.singleResult

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM