重构 JDBC 函数

Posted

技术标签:

【中文标题】重构 JDBC 函数【英文标题】:refactor JDBC function 【发布时间】:2012-09-01 11:46:48 【问题描述】:

我正在尝试创建一个简单的 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;

谢谢。

【问题讨论】:

【参考方案1】:

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

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

更多请看:

Introduction to Spring Framework JDBC

【讨论】:

【参考方案2】:

几个cmets:

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

我的两分钱!

【讨论】:

以上是关于重构 JDBC 函数的主要内容,如果未能解决你的问题,请参考以下文章

[代码重构]简化函数调用

重构map重构filter重构Some重构reduce方法重构flat函数

重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)

代码重构:函数重构规则

重构之--重新组织函数的几种方法

重构手法之重新组织函数