【问题标题】:using select statement in java database在java数据库中使用select语句
【发布时间】:2013-08-04 06:00:59
【问题描述】:

我正在尝试使用 select where 语句获取特定数据。我有一个运行良好的数据库。我到现在做的是这个

while (rs.next()){

            String username2=rs.getString("username");
            if(puname.equals(username2)) {
                System.out.println(puname);
                String queryPass= "select password from userdata where username="+username2;
                rs2 = st.executeQuery(queryPass);
                String passdb=rs2.getString("password");
                System.out.println("pass"+passdb);

结束我得到的错误是'where子句'中的未知列'john'

【问题讨论】:

  • 阅读这个:xkcd.com/327 你会被说服使用PreparedStatement

标签: java database select jdbc where-clause


【解决方案1】:

这是您生成的 SQL 字符串:

select password from userdata where username=John

它没有被引用,所以数据库认为它是一个列名。

您可以使用PreparedStatement,并将? 字符放在值的位置。然后您可以在执行查询之前使用setString 提供值。使用这种技术(绑定变量)可以防止 SQL 注入,而简单地将值直接引用到字符串中则不会。

【讨论】:

    【解决方案2】:

    正如其他 2 个答案中所指出的,您正在构建格式错误的 SQL 语句。这是您不应该以这种方式生成 SQL 的一个原因(但可能是最不重要的原因,因为它是快速失败的)。

    通过使用准备好的语句:

    //statement is a global\cached statement
    if(statement == null) {
        String sql = "select password from userdata where username=?";
        statement = connection.prepareStatement(sql);
    }
    statement.setString(1, "John");
    ResultSet rs = statement.executeQuery(selectSQL);
    

    数据库只需为语句制定一次执行计划(这是一项代价高昂的工作),您就不会受到 SQL 注入的影响。

    在您的示例中,如果我传递了值:'stu' or 1=1,我将能够执行语句:

    select password from userdata where username='Stu' or 1=1
    

    返回数据库中的所有密码。

    【讨论】:

      【解决方案3】:

      我看到的一个问题是:

      String queryPass= "select password from userdata where username="+username2;
      

      应该是(String参数时,用单引号括起来):

      String queryPass= "select password from userdata where username= '"+username2+"'";
      

      注意:建议使用PreparedStatments而不是普通的SQL语句,以避免SQL注入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 2011-12-31
        • 2012-08-04
        • 2021-04-11
        • 1970-01-01
        相关资源
        最近更新 更多