带有可选参数的 PreparedStatement SQL

PreparedStatement SQL with optional parameters

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

    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();

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

删除 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'''

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