【问题标题】:PreparedStatement SQL with optional parameters带有可选参数的 PreparedStatement SQL
【发布时间】:2015-08-21 08:26:56
【问题描述】:

所以我正在创建一个搜索功能,用户可以在其中选择要输入的字段,并且将根据这些字段查询数据库,而忽略未输入的字段。这是我用来尝试实现此目的的代码:

    PreparedStatement ps = DeviceTracker.getConnection().prepareStatement("use SBK_CAPE_COOKIES SELECT * FROM \"CC_Employees\"" 
                                                                          +"WHERE EmployeeID LIKE ? AND FirstName LIKE ? AND Surname LIKE ? AND Email LIKE ? AND Region LIKE ? AND Department LIKE ?"
                                                                          ,ResultSet.TYPE_SCROLL_INSENSITIVE,  ResultSet.CONCUR_READ_ONLY);
    if (!jTextField6.getText().isEmpty()) ps.setInt(1, Integer.parseInt(jTextField6.getText()));
    else ps.setString(1, "'%'"); 
    if (!jTextField5.getText().isEmpty()) ps.setString(2, "'"+jTextField5.getText()+"'");
    else ps.setString(2, "'%'"); 
    if (!jTextField4.getText().isEmpty()) ps.setString(3, "'"+jTextField4.getText()+"'");
    else ps.setString(3, "'%'"); 
    if (!jTextField3.getText().isEmpty()) ps.setString(4, "'"+jTextField3.getText()+"'");
    else ps.setString(4, "'%'"); 
    if(!jComboBox1.getSelectedItem().equals("All")) ps.setString(5, "'"+jComboBox1.getSelectedItem().toString()+"'");
    else ps.setString(5, "'%'"); 
    if(!jComboBox2.getSelectedItem().equals("All")) ps.setString(6, "'"+jComboBox2.getSelectedItem().toString()+"'");
    else ps.setString(6, "'%'"); 
    ResultSet rs = ps.executeQuery();

ResultSet 'rs' 每次都是空的。我做错了什么?

【问题讨论】:

  • 值设置为 '%' 这就是使用 LIKE 的原因。我不会让它们中的任何一个为空。
  • 删除 setString 方法中的单引号。它们将由准备好的语句自动设置。
  • 好吧,我不觉得自己很愚蠢。这就是问题所在。谢谢好心的先生。
  • 第一个参数是一个整数。某些(您的)数据库是否允许您使用LIKE '%' 查询整数列?还是该列实际上是一个 varchar 列?

标签: java sql sql-server-2008 prepared-statement


【解决方案1】:

删除 setString 方法中的单引号。它们将由准备好的语句自动设置。

 PreparedStatement ps = DeviceTracker.getConnection().prepareStatement("use SBK_CAPE_COOKIES SELECT * FROM \"CC_Employees\"" 
                                                                          +"WHERE EmployeeID LIKE ? AND FirstName LIKE ? AND Surname LIKE ? AND Email LIKE ? AND Region LIKE ? AND Department LIKE ?"
                                                                          ,ResultSet.TYPE_SCROLL_INSENSITIVE,  ResultSet.CONCUR_READ_ONLY);
    if (!jTextField6.getText().isEmpty()) ps.setInt(1, Integer.parseInt(jTextField6.getText()));
    else ps.setString(1, "%"); 
    if (!jTextField5.getText().isEmpty()) ps.setString(2, jTextField5.getText());
    else ps.setString(2, "%"); 
    if (!jTextField4.getText().isEmpty()) ps.setString(3, jTextField4.getText());
    else ps.setString(3, "%"); 
    if (!jTextField3.getText().isEmpty()) ps.setString(4, jTextField3.getText());
    else ps.setString(4, "%"); 
    if(!jComboBox1.getSelectedItem().equals("All")) ps.setString(5, jComboBox1.getSelectedItem().toString());
    else ps.setString(5, "%"); 
    if(!jComboBox2.getSelectedItem().equals("All")) ps.setString(6, jComboBox2.getSelectedItem().toString());
    else ps.setString(6, "%"); 
    ResultSet rs = ps.executeQuery();

您的陈述结果类似于WHERE EmployeeID LIKE '1' AND FirstName LIKE '''firstname'''

但我认为这不是您方法的好设计。你应该动态生成你的查询,所以你只添加使用的参数。

【讨论】:

  • 你说得对,但这会花费我更长的时间。这样做并不会真正减慢它的速度。我必须编写另一个具有更多参数的搜索函数。也许我会尝试你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
相关资源
最近更新 更多