带有动态where子句的Prepared语句

时间:2013-03-14 09:19:32

标签: java sql prepared-statement

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

  1. 员工姓名
  2. 员工ID
  3. 加入日期
  4. 用户可以提供一个或多个搜索条件。我需要查询数据库以获取搜索结果。

    使用普通JDBC,有两种方法可以实现这一目标。

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

      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
      2. 前:

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

        这个answer解释说,与上面的例子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框架)?

3 个答案:

答案 0 :(得分:4)

在这种情况下,我更喜欢在where子句中添加1=1,这样您就不必跟踪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 ...

相关question

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

在一行中没有任何复杂或昂贵的逻辑很容易做到......

假设你的三个变量是@ name,@ somename和@gender。

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

然后,您的Select语句就是:

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

这就是它的全部!没有复杂或昂贵的逻辑。