我正在尝试使用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'答案 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
返回数据库中的所有密码。