【问题标题】:Using Spring JdbcTemplate to extract one string使用 Spring JdbcTemplate 提取一个字符串
【发布时间】:2015-05-30 22:58:25
【问题描述】:

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

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

现在我应该如何获得 STREET_NAME 的值。 SQL 总是返回一行,所以不用担心返回多行。

关于一些背景信息: INNER JOIN and COUNT in the same query

使用托尼·斯塔克的回答来获得我的桌子。

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

【问题讨论】:

    标签: java sql hsqldb jdbctemplate


    【解决方案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, new Object[] { id }, String.class);
    
        return streetName;
    }
    

    【讨论】:

    • 我肯定试过你的代码。它如何知道您需要返回哪个列?它说:“列数不正确:预期 1,实际 2”
    • 这已被弃用我正在阅读,更新的解决方案是什么? queryForObject(java.lang.String, java.lang.Object[], java.lang.Class)' 已弃用
    【解决方案2】:

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

    顺便说一句,使用 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;
    }
    

    【讨论】:

    • 如果您使用 queryforobject 并返回零行。它将抛出一个 EmptyResultDataAccessException。建议改用查询方式,以便妥善处理。
    • 这已被弃用我正在阅读,更新的解决方案是什么? queryForObject(java.lang.String, java.lang.Object[], java.lang.Class)' 已弃用
    【解决方案3】:

    JdbcTemplate 类实现了JdbcOperations

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

    已弃用。从 5.3 开始,支持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;
    }
    

    【讨论】:

      【解决方案4】:

      根据最新规范 queryForObject,以下语法现已弃用

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

      新方法使用varargs

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

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

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

      【讨论】:

        【解决方案5】:

        我通常这样做:

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-12
          • 1970-01-01
          • 2021-08-03
          相关资源
          最近更新 更多