当前位置: 首页 > 面试题库 >

带动态where子句的预备语句

伯和蔼
2023-03-14
问题内容

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

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

等等

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

使用纯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框架)?


问题答案:

我不想StringBuilder每次都使用a 动态创建查询,尤其是在有意义的组合的数量是可数且有限的情况下。

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



 类似资料:
  • 问题内容: 我将如何在没有硬编码值的情况下编写此sql语句? 宁愿有这样的事情: 提前致谢.. 问题答案: 用您当前的方式构造SQL查询是一个糟糕的主意,因为它为各种SQL注入攻击打开了大门 。为了正确执行此操作,您必须改为使用“ 预备语句”。这也将解决您目前显然遇到的各种逃避问题。 请注意,这是一个昂贵的调用(除非您的应用程序服务器使用语句缓存和其他类似的功能)。从理论上讲,最好先准备一次语句,

  • 问题内容: 我有以下带有四个参数的存储过程。 存储过程: 好吧,我正在这样准备: 这是一个正确的方式 或 有没有更好的方式来准备动态条款? 问题答案: 这就是所谓的全部查询,它基本上是这样的:

  • 我需要实现一个方法来查询不同数量的条件。我不想每次都做一个新的准备好的语句,因为这就是为什么我首先使用准备好的语句。基本上我有三个条件。 现在我不知道如何用准备好的语句进行这样的查询。因为我没有办法设置。有什么建议可以实现这一点吗?

  • 例如,如果则添加一个where子句,但如果它为空,则不会在查询中使用该子句。 最好的情况是使用筛选表单来缩小记录列表:如果没有使用筛选器,则查询甚至不会使用WHERE,而所有筛选器都可能使用,从而产生一个大的WHERE查询。 正如我现在看到的,我需要为每种情况注册一个准备好的语句,但这将导致大量语句需要分别维护和测试。

  • 根据给定的表数据,第三行中的非空字段是“field1”和“field3”。因此WHERE子句将是: 我如何编写一个具有动态WHERE子句的通用SQL来满足这个需求?

  • VARCHAR 100 VARCHAR 100 VARCHAR 100 [ID][NAME][NICKNAME][FAVORITE_COLOR] 1约翰·约翰尼·瑞德 我尝试的另一个选择是: 这也不起作用,结果集为空。 最后,我尝试了一个不同的SQL,但它显然是错误的,返回了太多的行(因为它不够严格): 所以我的问题是:如何使用Java PreparedStatement使用MySQL“is nu