考慮這個簡單的方法:如何在不使用不同的預處理語句的情況下處理NULL和常規值?
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();
}
範例方法應該從一些表,其中一列的值匹配,這應該是簡單的選擇應有盡有。 醜陋的細節是,傳遞NULL的ID將導致空結果,不管有多少行是在DB,因爲SQL NULL定義爲不euqaling點兒什麼,甚至不爲NULL。 選擇那些我知道行使用不同的WHERE子句的唯一方法:
SELECT * FROM MyTable WHERE MyColumn IS NULL
不幸的是,只有這樣,才能使該方法正常工作在所有情況下似乎是有兩個完全不同的執行pathes,一個對於id參數爲空而一個用於常規值的情況。
這是非常醜陋的,當你有一個以上的列可以被清零可以得到非常混亂很快。如何使用相同的代碼路徑/語句處理NULL和正常值?
我不使用JDBC,但在C#我一般設置這使得'='/'IS NULL'動態選擇?該參數(如果有的話)仍然通過準備好的語句進行綁定。 – 2011-09-12 17:56:53
如果您使用的是SQL Server,那麼您可以執行SET SET_NULLS OFF,並且可以使用field = NULL。 – NullUserException
考慮休眠或JPA。它將從JDBC樣板中拯救你。 – BalusC