java - JSP - 如何编写有效的搜索表单

标签 java mysql sql jdbc netbeans

我在 JSP 项目中遇到搜索表单问题。特别是用户可以订阅一个事件,而管理员必须能够搜索该事件的所有成员。

我写了这样一个表格:

out.println("<fieldset><legend>Search</legend><form action=\"cercaIscritti.jsp\" method=\"post\">"
            + "Name: <input name=\"name\" type=\"text\"><br>Surname: <input name=\"surname\" type=\"text\"><br>"
            + "Belonging: <input name=\"belonging\" type=\"text\"><br>Countr: <input name=\"country\" type=\"text\"><br>"
            + "<input type=\"submit\" value=\"Cerca\"></fieldset></form>");

(如果它不可读:有四个 <input> ,一个用于表中的每一列 user 和一个 <input> 用于提交)。

我希望所有字段都是可选的,以便管理员可以填写它想要的内容,但我该如何构建查询?

我试过这样的:

public ResultSet searchSubs(String name, String surname, String belonging, String country) {
    try {
        boolean n = false, s = false, b = false, c = false;
        String query = "SELECT * FROM user WHERE ";
        if (!isEmpty(name)) {
            query += "firstName = ?";
            n = true;
        }
        if (!isEmpty(surname)) {
            if (n) {
                query += " AND lastName = ?";
            } else {
                query += "lastName = ?";
            }
            s = true;
        }
        if (!isEmpty(belonging)) {
            if (n || s) {
                query += " AND belonging = ?";
            } else {
                query += "belonging = ?";
            }
            b = true;
        }//and go on

但是我怎样才能用 PreparedStatement 添加值呢? ?这是正确的方法吗?如果不是,我怎么能做那样的事情?

中间的 boolean 值只是为了测试,我想我会以某种方式使用它们,但我不知道如何使用。

最佳答案

您可以按照以下方法使用多个值进行搜索:

public ResultSet searchSubs(String name, String surname, String belonging, String country){
    try {
        String query = "SELECT * FROM user WHERE 1=1";
        //---------------------------------------^^^
        int index = 1;
        if (!name.isEmpty()) {
            query += " AND firstName = ?";
        }
        if (!surname.isEmpty()) {
            query += " AND surname = ?";
        }
        if (!belonging.isEmpty()) {
            query += " AND belonging = ?";
        }

        if (!country.isEmpty()) {
            query += " AND country = ?";
        }

        PreparedStatement ps = connection.prepareStatement(query);

        if (!name.isEmpty()) {
            ps.setString(index++, name);
        }
        if (!surname.isEmpty()) {
            ps.setString(index++, surname);
        }
        if (!belonging.isEmpty()) {
            ps.setString(index++, belonging);
        }
        if (!country.isEmpty()) {
            ps.setString(index++, country);
        }

        ResultSet rs = ps.executeQuery();
        //...

这个想法很简单:

  • 在 Where 子句中使用 1=1 如果用户未输入任何值则不会出现错误(在这种情况下您的查询是 SELECT * FROM user WHERE 1=1,它会返回所有东西)
  • 第一部分如果用非空字段填充查询
  • 第二个 if 用正确的值填充准备好的语句。
  • 最后执行prepared语句并得到结果。

关于java - JSP - 如何编写有效的搜索表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47294023/

相关文章:

java - 实时数据库快照的存储位置

java - 在Ubuntu文件系统中上传文件后,文件没有格式

mysql - 如何 merge 本地和远程数据库?

c++ - 无法使 MySQL 连接器/C++ 工作 - 未处理的异常 (sql::SQLException) Visual Studio 2010

php - 将值插入具有 PHP 变量名称的表中

mysql - 有没有办法计算一组 mysql 列中的值

java - 覆盖方法可以具有与基类中不同的访问说明符吗?

java - 如何在不更改 Netbeans 背景的情况下禁用 JButton

PHP 社交网络好友数据库表包含序列化数据

java - UcanaccessSQLException : Unexpected page type 1