我正在处理一个继承而来的庞大的Java代码库,其中许多不同的方法以令人疯狂的方式查询数据库;在我进行调试和标准化一切的过程中,我编写的大部分代码最终看起来都像这样:
log.info("Audit-required logging for query: "+SOME_QUERY);
log.info("Ditto for each argument: "+parameter+" "+otherParameter+ ...);
ps = conn.prepareStatement(SOME_QUERY);
ps.setString(1, aString);
ps.setString(2, anotherString);
// ...
ps.setString(14, yetAnotherString);
rs = ps.executeQuery();
log.debug("Query executed: "+SOME_QUERY);
我讨厌要三次写下查询和两次参数(还要为每个参数做setString())——这是未来维护时出现错误的食谱。我宁愿将所有内容放在一个(静态的)通用方法中,这样我只需要说一次就可以了(并且可以为代码库未来提供保障,以防需要执行其他操作...比如法律部门需要不同类型的日志记录或者需要新的错误处理方式)。像这样:
public static PreparedStatement fullyPrepare(final Connection conn, final String query, final String... arguments) { ... }
我将使用一句话来调用它(而不是每次使用整个代码块):
ps = fullyPrepare(conn, CONSTANT_FOR_THIS_QUERY, parameter, otherParameter, ...);
然而,基于“这是不好的实践”的想法,我发现有人反对。我一直在尝试阅读相关内容,但我找不到任何关于从准备它的方法返回PreparedStatement是好还是坏的做法的说明(与处理ResultSet对象不同,例如在Is it Ok to Pass ResultSet?线程中)。
为什么我的预期PreparedStatement准备者会是一个不好的想法?