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

如何在Java中将准备好的语句用于选择查询?

冯曾笑
2023-03-14
问题内容

我已经使用预备语句尝试了几次,但是它返回SQL异常。这是我的代码:

public ArrayList<String> name(String mobile, String password) {
    ArrayList<String> getdata = new ArrayList<String>();
    PreparedStatement stmt = null;
    try {
        String login = "select mobile, password from tbl_1 join tbl_2 on tbl_1.fk_id=2.Pk_ID where mobile=? and password=?";

        String data = "select * from tbl_2  where password='" + password + "'";

        PreparedStatement preparedStatement = conn.prepareStatement(login);

        preparedStatement.setString(1, mobile);
        preparedStatement.setString(1, password);

        ResultSet rs = preparedStatement.executeQuery(login);

        Statement stmts = (Statement) conn.createStatement();

        if (rs.next()) {
            System.out.println("Db inside RS");
            ResultSet data = stmts.executeQuery(data);

            while (data.next()) { /* looping through the resultset */

                getdata.add(data.getString("name"));
                getdata.add(data.getString("place"));
                getdata.add(data.getString("age"));
                getdata.add(data.getString("job"));
            }

        }

    } catch (Exception e) {
        System.out.println(e);
    }

    return getdata;
}

运行此程序时,出现以下SQL异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? and password=?' at line 1.

有什么建议可以使这项工作吗?任何代码都值得赞赏。


问题答案:

您需要使用:

preparedStatement.executeQuery();

代替

preparedStatement.executeQuery(login);

当您将字符串传递给executeQuery()
查询时?,将按字面意义执行查询,因此将其发送到数据库,然后数据库会产生错误。通过传递查询字符串,您不会执行传递值的“已缓存”准备语句。



 类似资料:
  • 问题内容: 我创建了一个准备好的选择查询,但该查询似乎没有接听,或者结构错误。我正在尝试显示user_id图像的最后一个。显示用户的图像,但这是他们拥有的第一个id图像。我试着做,那是同一回事。 我这样做对吗? 问题答案: 我认为您不能: 在order by子句中使用占位符 绑定列名:您只能绑定值或变量,并将其值注入到prepared语句中。

  • 问题内容: 我正在努力学习在PHP中使用mysqli编写预备语句,通常,如果我对查询有疑问,我只需将其回显到屏幕上,就可以看到第一步。 我如何用准备好的陈述来做到这一点? 替换变量后,我想查看SQL语句。 问题答案: 使用准备好的语句: 准备该语句时,它会发送到MySQL服务器 当您绑定变量+执行语句时,只有变量被发送到MySQL服务器 并且语句+绑定变量在MySQL服务器上执行-无需在每次执行语

  • 其思想是创建一个准备好的语句将信息插入到用户表中,然后从生成的内容中获取insert_id以在另一个insert语句中使用 这是我的注册脚本的一个版本 第一条准备好的语句正确运行并向表中插入信息,之后成功回显$RETURNID变量。脚本中的下一个是我准备好的第二条语句,当它试图运行im时,得到的错误是: 致命错误:对第17行d:\filepath\register.php中的非对象调用成员函数bi

  • 问题内容: 在JPA(以及JBoss 5中包含的其余Hibernate软件包)中使用Hibernate 3.3.2GA时出现奇怪的性能问题。 我正在使用本机查询,并将SQL组装为准备好的语句。 SQL有很多联接,但是实际上非常基本,只有一个参数。喜欢: 该查询将在一秒钟内在MSSQL Studio上运行。 如果我加 查询将暂停9秒 但是,如果我只替换“?” 值(使其不是Prepared State

  • 问题内容: 我一直在阅读有关SQL注入的文章,并决定修改我的代码以防止SQL注入。 例如,我有一个输入,将值插入到数据库中。最初,我的预防注射措施是: 在我读过的文章中,有人建议应该使用准备好的语句。我已经更改了代码并使用了它: 尽管这可以防止SQL注入,但是它对XSS并没有任何作用。因此,我决定修改(removed )并使用它来防止脚本注入。 现在,我的问题是关于使用准备好的语句。我将插入三个项

  • 问题内容: 我已经使用prepared语句将订单插入到订单表中,但是现在我想根据订单表中插入的最后一个ID将订单项插入到订单表中: 等同于使用准备好的语句? 问题答案: 如果您使用的是PDO,则为。因此,如果您的数据库句柄称为: 如果您使用的是MySQLi,则为或: