2017-09-20 4 views
0

私はJDBCとMySQLを使用するDAOクラスを作成しています。私はタイトルに記載されている項目を閉じる方法については何の兆候も受けていないが、そうすることが良い習慣であることを読んだ。今、私はこれをすべてのCRUDメソッドで行うべきだと思っていましたが、例外を処理するのは少し人工的なように見えますが、実装方法については未定です。JDBCを使用するDAOクラスのResultSet、PreparedStatement、およびConnectionを閉じるためのtry-catchを処理する最も良い方法はどれですか?

まず例:

public boolean update2(Dto dto) { 
    assert dto != null; 
    if (readById(dto.getId()).getId() == 0) { 
     throw new RuntimeException("Row with this id doesn't exist"); 
    } 
    boolean flag = false; 
    try { 
     Connection connection = DAOFactory.createConnection(); 
     String sql = "SQL statement"; 
     try { 
      PreparedStatement ps = connection.prepareStatement(sql); 
      try { 
       // Some stuff with preparedstatement 
       ps.executeUpdate(); 
       flag = true; 
      } finally { 
       if (ps != null) ps.close(); 
      } 
     } finally { 
      if (connection != null) connection.close(); 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return flag; 
} 

第二の例:私は、重複した例外処理を必要とする第二の例で

public boolean update(Dto dto) { 
    assert dto != null; 
    if (readById(dto.getId()).getId() == 0) { 
     throw new RuntimeException("Row with this id doesn't exist"); 
    } 
    boolean flag = false; 
    PreparedStatement ps = null; 
    Connection connection = null; 
    try { 
     connection = DAOFactory.createConnection(); 
     String sql = "SQL statement"; 
     ps = connection.prepareStatement(sql); 
     // Some stuff with preparedstatement 
     ps.executeUpdate(); 
     flag = true; 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } finally { 
     if (ps != null) { 
      try { 
       ps.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (connection != null) { 
      try { 
       connection.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    return flag; 
} 

。最初の解決策は私にはもっと賢いようですが、私はそれが第2の解決策よりも読みやすいとは確信していません。

主観だけでなくデザインに採用される慣習はありますか?

答えて

1

Java 1.7以上を使用していると仮定すると、try with resourcesステートメントを使用してリソースのクローズを簡素化できます。

public boolean update2(String dto) { 
    assert dto != null; 

    if (readById(dto.getId()).getId() == 0) { 
     throw new RuntimeException("Row with this id doesn't exist"); 
    } 

    boolean flag = false; 
    String sql = "SQL statement"; 
    try (Connection connection = DAOFactory.createConnection(); 
     PreparedStatement ps = connection.prepareStatement(sql)) { 
     ps.executeUpdate(); 
     flag = true; 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return flag; 
} 
+0

この構築物は、はるかに読みやすいと私はそれを知りませんでした、どうもありがとうございました:リソースがConnectionPreparedStatementのためのケースですAutoClosableインターフェイスを実装することを提供し、あなたは次のようにコードを書き換えることができます。 しかし、1.7より古いバージョンでは、開発者に選択肢があるのか​​、採用すべき慣習があるのか​​分かりませんでした。 – TheItalianJobless

+0

次に、2番目のオプションを使用します。それは私が好むのは、コードが最初のものより少しクリーナーなのでです。 – ujulu

+0

これは良い答えですが、私は 'ClassNotFoundException'と多分' SQLException'をもっと積極的に扱います。実行時例外でそれらをラップします。これは、ほとんどの場合、リカバリできない展開/プログラミングエラー(またはデータ/ DBの問題)が原因です。 –

関連する問題