在java数据库中使用select语句

时间:2013-08-02 20:44:11

标签: java database select jdbc where-clause

我正在尝试使用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'

3 个答案:

答案 0 :(得分:2)

这是您生成的SQL字符串:

select password from userdata where username=John

没有引用,因此数据库认为它是列名。

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

答案 1 :(得分:1)

我看到的一个问题是:

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

应该是(当String参数时,将其放在单引号中):

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

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

答案 2 :(得分:1)

正如在其他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

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