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()and 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;
}

谢谢。

4

2 回答 2

2

一些评论:

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

我的两分钱!

于 2012-09-01T12:05:52.053 回答
2

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

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

有关更多信息,请参阅:

Spring框架JDBC介绍

于 2012-09-01T12:40:34.730 回答