2016-09-25 229 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())。