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

データ抽出


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


私たちのプロジェクトは、フィンランドの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にようこそ。 ソリューションの評価を受け取りたい 自転車 そして建設的な提案とコメント。



Source: https://habr.com/ru/post/J318740/


All Articles