2016-09-25 232 views
0

我正在研究Spring框架,下面是SQL查询来执行并获取结果。RowMapper/ResultsetExtractor春季

String sql = "SELECT DESCRIPTION FROM ATWData WHERE SNO = '980098' "; 

在Spring框架我们的RowMapper和ResultSetExtractor类回拨接口,哪一个是最好用来执行上述SQL查询并获取单个记录。下面的代码使用RowMapper和ResultSetExtractor获取结果。

代码使用ResultSetExtractor类:

try 
     { 
      description = jdbcTemplate.query(sql, 

      new ResultSetExtractor<String>() 
      { 
       public String extractData(final ResultSet rs) throws SQLException 
       { 
        if (rs.next()) 
        { 
         String description = null; 
         description = rs.getString("DESCRIPTION"); 
         return description; 
        } 
        return null; 
       } 
      }); 
     } 
     catch (final DataAccessException e) 
     { 
      LOG.error("Error " + e); 
     } 

下面的代码使用的RowMapper得到结果:

try 
    { 
     description = jdbcTemplate2.query(sql, 

     new RowMapper<String>() 
     { 
      public String mapRow(final ResultSet rs, final int rowNum) throws SQLException 
      { 
       String description = (String)rs.getString("DESCRIPTION")); 
       return description; 
      } 
     }); 
    } 
    catch (final DataAccessException e) 
    { 
     LOG.error("Error " + e); 
    } 

我看了一下这些方法,但文档困惑,选择一个在我现有方案。请建议哪个代码(RowMapper/ResultSetExtractor)最适合执行上面给出的简单SQL查询。

+1

我怀疑'extractData()'返回'LocalDate'将允许代码编译。 – Andreas

回答

0

在你的情况,或者没有问题。 RowMappers旨在将结果集中的一行转换为应用程序中的模型。 A ResultSetExtractor稍微更通用一些,您可以在ResultSet上完整操作,而不是只在一行上操作。这只取决于你需要对结果做什么。在提取单个字符串的情况下,它们都起作用。另请参阅this question了解更多信息。您的问题可能被标记为重复。

0

请勿使用。

但是第一,更重要的是:

  • 使用字符串连接,除非你想离开自己开放给SQL Injection攻击不要构建一个SQL语句,允许黑客窃取你的数据和/或损坏或删除您的数据库。

  • 不要赶上DataAccessException并继续执行,因为如果一切正常。调用者需要意识到查询失败,并且很可能想要回滚任何待处理的事务。

由于您的查询是带参数的单行/单列查询,请使用queryForObject(String sql, Class<T> requiredType, Object... args)

这是你应该做的:

String sno = "980098"; 
String sql = "SELECT DESCRIPTION FROM ATWData WHERE SNO = ?"; 
String description = jdbcTemplate2.queryForObject(sql, String.class, sno); 

它会抛出EmptyResultDataAccessException如果没有行被发现。如果缺失的行不被视为错误,请捕获异常并返回null(或Optional.empty())。