重构JDBC函数

时间:2012-09-01 11:46:48

标签: java jsp jdbc

我正在尝试创建一个简单的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(),我会重复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;
}

感谢。

2 个答案:

答案 0 :(得分:2)

几条评论:

  1. ClassNotFoundException的catch语句应抛出异常,不应再继续。
  2. 从语句执行时获取它们的方法返回结果集并不是一个好主意,因为关闭它是该方法的责任。相反,如果下游函数需要结果集,则应该将结果读出到对象中或将它们缓存到CachedRowSet中。
  3. connectToDB方法应返回成功连接或抛出异常。
  4. 您可以编写一个接收SQL查询并将结果作为对象返回的方法,以便只要您检索相同类型的对象,就可以使用此方法根据不同的条件进行检索。
  5. isExisted正在使用staff_number,我认为你打算将其作为staffID。如果找到一个具有此值的行,则无需检查结果集是否包含具有此值的行,对吧?
  6. 我的两分钱!

答案 1 :(得分:2)

使用原始JDBC会产生许多难看的样板代码。一种解决方案是使用Spring JDBC Template

此外,您将获得sql异常层次结构,该层次结构将自动将基础JDBC异常作为运行时异常进行管理。

了解更多信息:

Introduction to Spring Framework JDBC