2012-09-01 16 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。如果你找到了一个包含这个值的行,那么就不需要检查结果集是否包含这个值的行,对吧?

我的两毛钱!