我有一个包含多个搜索条件的搜索页
等
用户可以提供一个或多个搜索条件。我需要查询数据库以获取搜索结果。
使用普通JDBC,有两种方法可以实现这一目标。
例如:
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 ...
preparestatement
前:
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框架)?
答案 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 = '')
这就是它的全部!没有复杂或昂贵的逻辑。