データマイニングのバイク

データ抽出







産業発展に携わっているすべての人に 流血の企業 データベースワークレイヤーの作成に何度も対処しなければなりませんでした。 私たちもこれに直面しました。







私たちのプロジェクトは、フィンランドのVaadinフレームワークとデータベース層のコアにある純粋なJDBC上に構築されています。 JDBCの経験がなかったため、スパゲッティコードの十分な大きさのレイヤーを積み上げ、それから勇敢に対処しました。







どのようにそれと戦ったか、どのような自転車をカットして発明したかについて。









そのような決定に至った理由



Vaadinでは、 BeanItem Container



を使用してUIコンポーネントにデータを表示できます。ここで読むことができます。







ドメイン概要


ユーザーに表示される特定の数のエンティティであり、ユーザーはそれらを編集する必要があります:削除、変更、追加。







エンティティは、 Bean



仕様を使用して記述されました。







 public class Element implements Serializable{ private Integer id = 0; private String name = ""; private Float price = 0.0F; // getter and setter for property }
      
      





そのような要素のコンテナは簡単に作成されます:







 BeanItemContainer<Element> container = new BeanItemContainer<>(Element.class);
      
      





そして、このコンテナはsetContainerDataSource(...)



メソッドを使用してUIに置き換えられます。







このコンテナを取得するには、まずデータベースクエリを使用して取得したResultSet



からElement



クラスのインスタンスに解析する必要があります。







当初、ソリューションは次の種類でした。







 public Element(ResutlSet rs){ try { id = rs.getInt("id"); }catch(SqlException e){ id = 0; e.printStackTrace(); } try { name = rs.getString("name"); }catch(SqlException e){ name = ""; e.printStackTrace(); } try { price = rs.getFloat("price"); }catch(SqlException e){ price = 0.0f; e.printStackTrace(); } }
      
      





そしてここで、Javaの第一人者とカルマの怒った表情は、マイナスに飛ぶように私に向けられるべきです。

しかし、概念は次のとおりです: ResultSet



からのデータの解析中にフィールドがエラーを引き起こした場合、システムはException



で抜け出て動作し続け、エラーログを書き込むべきではありません(ログは別の記事では説明しません)。







しかし、私はそのようなコードがひどいことを認めており、ボブおじさんの悪名高い本を読んだ後、このコードを修正するための抵抗できない欲求が現れました。







その結果、彼らはResultSet



からデータを取得するライブラリを作成しました。







実装



Decoratorパターンを使用して、小さなExecutorライブラリを作成しました。







このライブラリは、データを取得するための安全なメソッドを追加することにより、 ResultSet



の機能を拡張します。







 public Integer getInt(String columnName) { Integer i = 0; try { i = rs.getInt(columnName); } catch (SQLException ignored) { } return i; } public Integer getIntNull(String columnName) { Integer i = 0; try { i = rs.getInt(columnName); if (rs.wasNull()) return null; } catch (SQLException ignored) { } return i; } public String getString(String columnName) { String s = ""; try { s = rs.getString(columnName); if (s == null) return ""; } catch (SQLException ignored) { } return s; }
      
      





したがって、Vaadinで少し怖いように見えるデータを処理するときに、結果を取得し、 Exception



なく動作することを100%保証します。







これはユーザーのウィンドウにあります







質問に対するException



必要な場合、答えは次のとおりです。単純なSqlExecption



ないため、呼び出されたException



タイプのExecutor



コンストラクExecutor



を追加し、正しい操作のためのメソッドを実装する計画です。







次の形式のAPIが計画されています( UPD: コメントからの提案が行われます )。







 public Executor(ResultSet rs, Class<? extends RuntimeException> exceptionClass){ this.rs = rs; this.exceptionClass = exceptionClass; } public Integer getIntThrow(String columnName) { Integer i = 0; try { i = rs.getInt(columnName); if (rs.wasNull()) return null; } catch (SQLException ex) { throw exceptionClass.newInstance(); } return i; }
      
      





そしてユースケース







 public Element(ResutlSet rs){ Executor ex = new Executor(rs, CreateElementException.class); id = ex.getIntThrow("id"); name = ex.getStringThrow("name"); price = ex.getFloatThrow("price"); } private class CreateElementException extends RuntimeException{ private String message = ""; public CreateElementException(String message){ this.message = message; } @Override public String getMessage(){ return "Exception with access to column with name " + this.message; } }
      
      





使用例



このライブラリを使用した後のコードで何が起こるか。 Element



クラスのコンストラクターは次のように変更されました。







 public Element(ResutlSet rs){ Executor ex = new Executor(rs); id = ex.getInt("id"); name = ex.getString("name"); price = ex.getFloat("price"); }
      
      





その結果:









おわりに



別の自転車を作りました 自転車もできる必要がある 、データベースからデータを受信するためのユニバーサルで安全なアクセスを提供します。 ソースライブラリを使用したい人はGitHubにようこそ。 ソリューションの評価を受け取りたい 自転車 そして建設的な提案とコメント。








All Articles