7

我有一个包含多个搜索条件的搜索页面

  1. 员工姓名
  2. 员工ID
  3. 加入的日期
  4. 部门

ETC

用户可以提供一个或多个搜索条件。我需要查询数据库以获取搜索结果。

使用普通的 JDBC,有两个选项可以实现这一点。

  1. 通过附加用户提供的搜索条件来准备 SQL 查询。

前任:

String selectClause = "SELECT * FROM EMPLOYEES WHERE ";
String whereClause = "";
if(StringUtils.isNotBlank(empName)){
    if(whereClause.length > 0){
        whereClause += " AND ";
    }
    selectQuery += " EMP_NAME = " + empName;
}
if(StringUtils.isNotBlank(empID)){
    if(whereClause.length > 0){
        whereClause += " AND ";
    }
    selectQuery += " EMP_ID = " + empID;
}
//... and so on ...
  1. 使用preparestatement

前任:

String query = "SELECT * FROM EMPLOYEES WHERE EMP_NAME = ? AND EMP_ID = ? DATE_OF_JOINING = ? AND DEPARTMENT = ?";

这个答案解释说,就像上面的 ex 1,ex2 可以修改,如下所示

String selectClause = "SELECT * FROM EMPLOYEES WHERE ";
String whereClause = "";
if(StringUtils.isNotBlank(empName)){
    if(whereClause.length > 0){
        whereClause += " AND ";
    }
    selectQuery += " EMP_NAME = ?";
}
if(StringUtils.isNotBlank(empID)){
    if(whereClause.length > 0){
        whereClause += " AND ";
    }
    selectQuery += " EMP_ID = ?";
}
//... and so on ...

然后仔细(记住参数索引)输入需要设置为准备好的语句。这听起来不是一个非常理想的解决方案。

有没有办法以优雅的方式做到这一点(没有 ORM 框架)?

4

3 回答 3

4

我不喜欢StringBuilder每次都使用 a 来动态创建查询,尤其是当有意义的组合的数量是可数且有限的时。

我总是更喜欢静态字符串。是的,您必须输入它们,但您只需要输入一次。我宁愿这样做,也不愿在复杂性和运行时付出代价。

于 2013-03-14T09:25:32.127 回答
4

在这种情况下,我更喜欢添加1=1where 子句,这样您就不必跟踪插入的位置AND

String selectClause = "SELECT * FROM EMPLOYEES WHERE 1=1 ";
if(StringUtils.isNotBlank(empName)){
   selectQuery += "AND EMP_NAME = " + empName;
}
if(StringUtils.isNotBlank(empID)){
   selectQuery += "AND EMP_ID = " + empID;
}
//... and so on ...

相关问题

于 2014-02-16T06:11:48.477 回答
4

这很容易做到,无需任何复杂或昂贵的逻辑,只需一行......

假设您的三个变量是@name、@surname 和@gender。

还假设在不需要过滤器时将提供零长度字符串。

然后,您的 Select 语句很简单:

    select * from table_name where (name = @name or @name = '') and (surname = @surname or @surname = '') and (gender = @gender or @gender = '')

这里的所有都是它的!没有复杂或昂贵的逻辑。

于 2017-01-09T16:30:04.417 回答