我正在研究一个继承的大型Java代码库,其中许多不同的方法以疯狂不同的方式对数据库进行查询;因为我一直在调试,规范一切,最让我写的代码最终看起来像这样:从实用程序方法返回PreparedStatement是否是一种好习惯?
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中准备PreparedStatement的方法是好的还是不好的做法(与处理ResultSet对象相反,如线程Is it Ok to Pass ResultSet?)。
为什么我预期的PreparedStatement预备好是一个坏主意?
您可能想要检查[DbUtils](https://commons.apache.org/proper/commons-dbutils/),[jdbc-helper](https://code.google.com/archive/) p/jdbc-helper /)或[jdbi](http://jdbi.org/)。他们完成您在问题中展示的所有工作,并且在您不需要/需要整个ORM系统(如Hibernate,MyBatis,jooq等)时使用它们很好用。(编辑:修正了jdbc-helper链接到我正在考虑的那个,而不是Jruby的那个) –