首页 > 解决方案 > 如何使用 if 语句构建查询

问题描述

我想使用用户输入从数据库中获取数据

    int fnameNum = 0;
        int lnameNum = 0;
        int emailNum = 0;

        if (firstName != null) {
            sb.append(" E.FIRST_NAME = ? ");
            fnameNum = 1;
            if (email == null) {
                sb.append(" AND ");
                sb.append(" E.LAST_NAME LIKE ? ");
                lnameNum = 2;
            } else if (lastName == null) {
                sb.append(" AND ");
                sb.append(" E.EMAIL = ? ");
                emailNum = 2;
            } else {
                sb.append(" AND ");
                sb.append(" E.LAST_NAME LIKE ? ");
                lnameNum = 2;
                sb.append(" AND ");
                sb.append(" E.EMAIL = ? ");
                emailNum = 3;
            }
        }

        String sqlString = sb.toString();
        preStatement = connection.prepareStatement(sqlString);

        if (fnameNum > 0) {
            preStatement.setString(fnameNum, firstName);
        }
        if (lnameNum > 0) {
            preStatement.setString(lnameNum, lastName + "%");
        }
        if (emailNum > 0) {
            preStatement.setString(emailNum, email);
        }

        ResultSet rs = preStatement.executeQuery();

html中有3个文本框。我想根据用户的输入从数据库中获取数据,即使另一个文本框是空白的或者所有的文本框都填充了数据。

标签: sql

解决方案


这是使用字符串连接创建 SQL 语句的最糟糕的想法。使用这种方法,您会有很多处罚/担忧。他们之中有一些是:

  • 开放 SQL 注入
  • DBMS 无法优化查询(因为它是动态变化的)
  • 不可读(开发人员友好)

最好的选择是使用命名参数(如果您的 DBMS 系统支持)。请参见下面的示例:

SELECT * from TBL
WHERE (:NAME is null or NAME = :NAME) AND
      (:SURNAME is NULL or SURNAME = :SURNAME)

推荐阅读