JDBC:如何在Java PreparedStatement中处理通配符

时间:2012-07-16 01:50:03

标签: java sql jdbc

例如,如果我有:

connection.prepareStatement("SELECT * FROM users 
                                   WHERE status=? AND otherAttribute=?");

在某些情况下,我可能需要特定状态,而在其他情况下,我需要所有状态。我怎么能基本上做类似的事情:

preparedStatement.setInt(1, mySpecificRequestedStatus);

以及其他情况:

preparedStatement.setInt(1, allStatuses); // wildcard

因此我不必拥有多个PreparedStatements,特别是对于SELECT语句中更复杂的WHERE子句,其中排列可以更高。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

connection.prepareStatement("SELECT * FROM users 
                               WHERE (status=? OR ?=1) AND otherAttribute=?");

第二个?用于“所有状态”属性:如果要忽略状态,请将其设置为1;如果您希望考虑特定的status,请将其设置为零。

答案 1 :(得分:1)

你没有选择,你必须选择我最初怀疑和问过的一个或另一个。

你可以:

  1. 使用if子句创建复杂的预准备语句
  2. 创建一个没有最佳性能的复杂SQL语句
  3. 这确实没有一个好的解决方案。这就是为什么要将ORM抽象出来的原因。问题是ORM引入了其他问题/复杂性以换取简化其他事情。

答案 2 :(得分:0)

Stephane Grenier,

为什么不在数据库中创建function or procedure并从function or procedure致电java?这将解决许多麻烦,保持你的java代码整洁,当然没有硬编码的SQL查询。

问候