2016-09-25 13 views
0

私は春のフレームワークに取り組んでいます。実行するSQLクエリは次のとおりです。 SpringフレームワークでRowMapper/ResultsetExtractor in spring

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

我々はRowMapperのとResultsetExtractorは、上記のSQLクエリを実行し、単一のレコードを取得するために使用するのが最善である1、インターフェースをコールバックがあります。以下のコードは、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); 
    } 

を私はこれらのメソッドについてのドキュメントを読むが、私の中のいずれかを選択するために混乱しています既存のシナリオ。上記の単純なSQLクエリを実行するのにどのコード(RowMapper/ResultSetExtractor)が最も適しているかをお勧めします。

+1

'LocalDate'を返すために' extractData() 'を宣言することは、コードのコンパイルを可能にします。 – Andreas

答えて

0

いずれの場合も問題ありません。 RowMappersは、結果セットの行をアプリケーションのモデルに変換するように設計されています。 ResultSetExtractorはやや汎用的で、1行だけではなく、全体で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())を返します。

関連する問題