【发布时间】:2011-09-12 17:49:01
【问题描述】:
考虑这个简单的方法:
public ResultSet getByOwnerId(final Connection connection, final Integer id) throws SQLException {
PreparedStatement statement = connection.prepareStatement("SELECT * FROM MyTable WHERE MyColumn = ?");
statement.setObject(1, id);
return statement.executeQuery();
}
示例方法应该从某个表中选择列值匹配的所有内容,应该很简单。 丑陋的细节是,为 id 传递 NULL 将导致一个空的 ResultSet,而不管数据库中有多少行,因为 SQL 将 NULL 定义为不是 euqaling anyting,甚至不是 NULL。 选择我知道的那些行的唯一方法是使用不同的 where 子句:
SELECT * FROM MyTable WHERE MyColumn IS NULL
不幸的是,使该方法在所有情况下都能正常工作的唯一方法似乎是拥有两种完全不同的执行路径,一种用于 id 参数为 null 的情况,另一种用于常规值。
这非常难看,当您有多个可以为空的列时,很快就会变得非常混乱。如何使用相同的代码路径/语句处理 NULL 和正常值?
【问题讨论】:
-
我不使用 JDBC,但在 C# 中我通常设置它以便动态选择
= ?/IS NULL。参数(如果有)仍然通过准备好的语句绑定。 -
如果您使用的是 SQL Server,则只需执行
SET ANSI_NULLS OFF和field = NULL即可。 -
考虑 Hibernate 或 JPA。它会让你从 JDBC 样板文件中解脱出来。
标签: java jdbc prepared-statement