重构 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 (以函数对象取代函数)