带有动态where子句的Prepared语句

Apu*_*urv 7 java sql prepared-statement

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

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

等等

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

使用普通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 ...
Run Code Online (Sandbox Code Playgroud)
  1. 运用 preparestatement

例如:

String query = "SELECT * FROM EMPLOYEES WHERE EMP_NAME = ? AND EMP_ID = ? DATE_OF_JOINING = ? AND DEPARTMENT = ?";
Run Code Online (Sandbox Code Playgroud)

这个答案解释说,像上面的例子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 ...
Run Code Online (Sandbox Code Playgroud)

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

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

duf*_*ymo 4

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

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

  • 您的意思是我应该为每种输入组合准备好静态查询?目前我有四个输入,因此查询四个输入的组合?未来可能会有更多的投入。这不就完事了吗? (3认同)