我目前正在做一个项目,它与数据库做了大量的工作。
下面是我在代码中多次重用的一个核心习惯用法。
我的问题是,有没有更好的方法来处理getTransformedResults方法每个步骤中的异常?这是处理SQLExceptions的适当方式,还是有更好、更简洁的方式呢?
感谢您的投入!
public ResultType handleResultSet(ResultSet rs);
public ResultType getTransformedResults(String query) throws SQLException {
ResultType resultObj = new ResultType();
Connection connection = null;
try {
connection = dataSource.getConnection();
} catch (SQLException sqle) {
// cleanup
throw sqle;
}
Statement stmt = null;
try {
stmt = connection.createStatement();
} catch (SQLException sqle) {
try { connection.close() } catch (SQLException dontCare) {}
// cleanup
throw sqle;
}
ResultSet rs = null;
try {
ResultSet rs = stmtm.executeQuery(query);
resultObj = handleResultSet(rs);
} catch (SQLException sqle) {
// cleanup
throw sqle;
} finally {
if (rs != null) try { rs.close() } catch (SQLException dontCare) {}
try { stmt.close() } catch (SQLException dontCare) {}
try { connection.close() } catch (SQLException dontCare) {}
}
return resultObj;
}发布于 2012-07-13 00:13:19
您可能会对使用Apache Commons DbUtils感兴趣,它就是针对这样的目的。
在尝试使用更复杂的JDBC时,它有一些缺点,但对于常规使用来说,它应该足够了。
除此之外,您的代码包含太多的try/catch块,可以简化为如下所示:
public interface ResultSetHandler<ResultType> {
ResultType handleResultSet(ResultSet rs);
}
public <ResultType> ResultType getTransformedResults(String query, ResultSetHandler<ResultType> rsh) throws SQLException {
Connection connection = null;
Statement stmt = null;
try {
connection = dataSource.getConnection();
stmt = connection.createStatement();
ResultSet rs = stmtm.executeQuery(query);
return rsh.handleResultSet(rs);
} catch (SQLException sqle) {
// cleanup
throw sqle;
} finally {
if(stmt != null) {
statement.close(); // closes also resultSet
connection.close();
}
}
}尽管Apache Commons的DbUtils库在幕后做着同样的事情。
发布于 2012-07-13 00:01:26
Java 7有一些你可能会喜欢的结构,我认为你可以使用try/finally而不带catch (它模仿了你的catch和rethrow)。
此外,由于您已经捕获并处理了SQL异常,因此可能应该将其作为其他异常重新抛出--可能是作为运行时异常--这使得在主要入口点捕获所有运行时异常变得更容易,而不必在每次访问数据库时都处理异常。
发布于 2012-07-13 00:03:07
就我个人而言,我可能会通过传递接口实现而不是子类化来处理这一点。
最终,如果您只处理该方法中的异常,而不是污染主线代码,那么您还能做什么,这样做的意义是什么?你可以把每一步都做得更细粒度一点,这样就不会把所有的都放在一个方法里,但除此之外……
您可能会考虑特定于应用程序的异常,这可能会使测试和配置更清晰,但这取决于上下文。
界面理念的澄清
您可以使用一个接口来实现对结果集和查询字符串检索的处理,而不是子类化,因此有两个方法--一个用于查询,另一个用于结果。
您会将一个实现传递给一个实例,其中大部分是您现在拥有的,但是它接受接口而不是查询字符串。其余代码基本上是相同的,但它从接口impl获取查询字符串,并调用接口impl的结果处理方法,将结果保存到清除。
它本质上与您现在拥有的相同,但IMO更干净,因为任何类都可以实现接口,包括匿名类或域中的其他类。
https://stackoverflow.com/questions/11455815
复制相似问题