2012-09-01 15 views
0

我想創建一個簡單的web應用程序,它將用戶數據從表單保存到數據庫,並根據請求將數據庫的內容讀回瀏覽器。以下是我迄今撰寫的功能。重構JDBC函數

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(),我重複mysel。這兩個函數的作品,但我期待重構代碼。在這些功能我沒有關閉連接。如果在連接到數據庫的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; 
} 

感謝。

回答

1

一對夫婦的意見:

  1. ClassNotFoundException catch語句應該拋出一個異常,不應該再繼續下去。
  2. 從語句執行時獲得它們的方法返回結果集並不是一個好主意,因爲關閉它的方法是該方法的責任。相反,如果下游函數需要結果集,則應將結果讀出到對象中或將其緩存到CachedRowSet中。
  3. connectToDB方法應返回成功的連接或拋出異常。
  4. 您可以編寫一個方法,該方法接受SQL查詢並將結果作爲對象返回,以便只要您檢索相同類型的對象,就可以使用此方法根據不同的條件進行檢索。
  5. isExisted正在使用我認爲您打算成爲staffID的staff_number。如果你找到了一個包含這個值的行,那麼就不需要檢查結果集是否包含這個值的行,對吧?

我的兩毛錢!