Java中的SQL SELECT语句

Java中的SQL SELECT语句,java,sql,database,Java,Sql,Database,我试图通过执行带有传入参数的查询,从数据库中获取特定结果。目前它说结果集是空的,我知道它不应该是空的,因为数据库中有一行符合“where子句”。所以我认为这是我的查询语句的问题,因为这是我第一次从Java查询数据库 以下是查询的代码: public ResultSet getWordNetPathResultsFromDatabase(double result) throws SQLException { //System.out.println(words); Stateme

我试图通过执行带有传入参数的查询,从数据库中获取特定结果。目前它说结果集是空的,我知道它不应该是空的,因为数据库中有一行符合“where子句”。所以我认为这是我的查询语句的问题,因为这是我第一次从Java查询数据库

以下是查询的代码:

public ResultSet getWordNetPathResultsFromDatabase(double result) throws SQLException {
    //System.out.println(words);
    Statement statement = conn.createStatement();

    ResultSet wordNetResults = statement.executeQuery("SELECT WORDNETRESULT FROM WORDNETSCORES WHERE LINRESULT = 'result'");

    return wordNetResults;
}

您的结果变量是双精度类型。因此,在您的查询中不需要单个报价:

ResultSet wordNetResults = ("SELECT WORDNETRESULT FROM WORDNETSCORES WHERE LINRESULT = "+ result);
如前所述,您的查询应该只返回那些LINRESULT=result的结果。现在,在getWordNetPathResultsFromDatabase()函数参数中,您已经使用result作为函数参数,并将其数据类型指定为double。在查询中,您实际上并没有试图返回一个双精度值,而是返回一个名为“result”的字符串。这就是它制造混乱的原因

你可以做以下两件事中的任何一件

要么:

public ResultSet getWordNetPathResultsFromDatabase(double result) throws SQLException {
//System.out.println(words);
Statement statement = conn.createStatement();

ResultSet wordNetResults = statement.executeQuery("SELECT WORDNETRESULT FROM WORDNETSCORES WHERE LINRESULT = " + result);

return wordNetResults;
}

在这里,为了在querystring中使用结果值返回结果值,必须使用“+”符号将其与查询语句分开。这是标准方法

或者,如果要返回字符串“result”,则可以执行以下操作:

public ResultSet getWordNetPathResultsFromDatabase(String s) throws SQLException {
//System.out.println(words);
Statement statement = conn.createStatement();

s = 'result';    

ResultSet wordNetResults = statement.executeQuery("SELECT WORDNETRESULT FROM WORDNETSCORES WHERE LINRESULT = " + s);

return wordNetResults;
}


这取决于你到底想要达到什么样的结果。选择权在你

空就是空。如果这是可疑的,请附加调试器并在使用结果集之前检查它。在命令行客户端上运行相同的查询并验证结果。是否在某处调用
ResultSet.next()
?此外,您正在将列
LINRESULT
的值与字符串literal
'result'
进行比较,而不是与传递的变量
result
的内容进行比较。阅读
PreparedStatement
以正确地将参数传递给SQL语句:除了查询字符串本身所述的问题外,双精度通常不能安全地进行相等性比较;因为浮点值不能精确地表示十进制数,所以对它们进行数学运算可能会产生非直观的结果-
.3-.2
可能不等于
0+.1
。现代处理器也有特殊的硬件用于计算,其位计数比存储的要高,因此值也可以在那里微妙地改变。你想在这里做什么?实际上,简单引号的需要取决于数据库中字段的类型,而不是用于构造查询的变量。是的,是真的,但如果在java程序中,您定义了result double,因此认为在数据库中,列的类型是十进制的,如果您在哪里查询字符串,语法会是什么?在任何情况下,他都不应该使用字符串输入参数执行此操作-他将很好地接受SQL注入。没有理由一开始就不应该是一个参数化的、准备好的查询,这甚至可能使查询速度更快。