1

ユーザーデータをフォームからデータベースに保存し、要求に応じてデータベースのコンテンツをブラウザーに読み戻す簡単なWebアプリを作成しようとしています。これまでに書いた関数は次のとおりです。

connectToDB()            // connects to database
addEmployee()            // adds employee to database
displayEmployee()        // returns a resultSet 
isExisted(int staffID)   // checks if the staff already exists

データベース接続機能:

public void connectToDB(){
   try{
       // load Apache derby driver
       Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
   } catch(ClassNotFoundException e) {
       System.err.println(e);
   }

   try{
       connection = DriverManager.getConnection(DBNAME, USERNAME, PASSWORD);
   } catch(SQLException e){
       System.err.println(e);
   }
} // end connectToDB

従業員機能の表示:

public ResultSet displayEmployee(){
   connectToDB(); 
   ResultSet result = null;

   try{
       Statement stmt = connection.createStatement();
       String query = "SELECT * FROM APP.ADDRESSBOOK";
       result = stmt.executeQuery(query);

   } catch(SQLException e) {
       System.err.println(e);
   }

   return result;

}

従業員が存在するかどうかを確認します。

public boolean isExisted(int StaffID){
   connectToDB();
   try{
       Statement stmt = connection.createStatement();
       String query = "SELECT StaffNum FROM APP.ADDRESSBOOK WHERE StaffNum = " + staff_number;
       ResultSet result = stmt.executeQuery(query);

       while(result.next()){
           int temp = result.getInt(1);
           if(temp == staff_number){return true;}
       }
   } catch(SQLException e) {
       System.err.println(e);
   }
   return false;
}

ご覧のとおり、とを比較するdisplayEmployee()isExisted()、私は自分自身を繰り返しています。どちらの関数も機能しますが、コードをリファクタリングしようとしています。それらの関数では、接続を閉じていません。データベースに接続するWebアプリに20個の関数がある場合、私のコードは悪臭を放ちます。

私はこのようなものを探しています: *このコードは機能しません* ** * **

private Statement queryDB(query){
   connectToDB(); 

   Statement stmt;
    try{
       stmt = connection.createStatement();

   } catch(SQLException e) {
       System.err.println(e);
   }
   return stmt;

   // code for closing connection
}

public ResultSet DisplayEmployee(){
   String query = "SELECT * FROM APP.ADDRESSBOOK";
   Statement stmt = queryDB(query);
   ResultSet result = stmt.executeQuery(query);
   return result;
}

ありがとう。

4

2 に答える 2

2

コメントのカップル:

  1. のcatchステートメントはClassNotFoundException例外をスローし、それ以上続行しないでください。
  2. ステートメントの実行時に結果セットを取得したメソッドから結果セットを返すことは、そのメソッドの責任であるため、お勧めできません。代わりに、結果をオブジェクトに読み込むCachedRowSetか、ダウンストリーム関数が結果セットを期待している場合はそれらをキャッシュする必要があります。
  3. connectToDBメソッドは、成功した接続を返すか、例外をスローする必要があります。
  4. SQLクエリを受け取り、結果をオブジェクトとして返すメソッドを記述して、同じタイプのオブジェクトを取得している限り、このメソッドを使用してさまざまな基準に基づいて取得できるようにすることができます。
  5. isExistedはstaff_numberを使用していますが、これはstaffIDになる予定です。この値の行が見つかった場合、結果セットにこの値の行が含まれているかどうかを確認する必要はありません。

私の2セント!

于 2012-09-01T12:05:52.053 に答える
2

生のJDBCを使用すると、見苦しいボイラープレートコードが大量に生成されます。1つの解決策は、 SpringJDBCTemplateを使用することです。

さらに、基になるJDBC例外をランタイム例外として自動的に管理するSQL例外階層を取得します。

詳細については、以下を参照してください。

SpringFrameworkJDBCの概要

于 2012-09-01T12:40:34.730 に答える