SQL提供值的子句

时间:2012-01-09 19:57:43

标签: java sql

我正在尝试在Java中使用SQL Select语句进行查询。我目前有以下内容:

ResultSet rs = stmt.executeQuery("SELECT *" +
                                             " FROM " + table + 
                                             " WHERE " + selection + 
                                             " VALUES " + selectionArgs);

其中“selection”是一个字符串,“selectionArgs”是一个字符串数组。

 String selection = "documentFK=?";
 String[] selectionArgs = { ... };

是否可以使用VALUES命令将?替换为INSERT命令?无论哪种方式,什么是正确的语法?

感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

我相信你要找的是IN声明。您的查询应如下所示:

SELECT *
FROM table
WHERE documentFK IN ('doc1', 'doc2', 'doc3')
    AND userFK IN ('user1', 'user2', 'user3')

这显然会让你的代码变得更难看。您必须确保WHERE关键字用于第一个子句,但AND关键字用于每个其他子句。此外,每个列表都必须以逗号分隔。

答案 1 :(得分:2)

不,这不是它完成的方式。首先,您可以使用问号作为占位符来创建查询中的语句,以用于放置在那里的实际值。然后将这些值绑定到语句。

//the query
String sql = "SELECT " + "*" +
                " FROM " + table + 
                " WHERE documetFK = ?";

//create the statement
PreparedStatement stmt = connection.prepareStatement(sql);

//bind the value
stmt.setInt(1, 4); //1 is "the first question mark", 4 is some fk

//execute the query and get the result set back
ResultSet rs = stmt.executeQuery();

现在,如果你想要这个东西有选择字符串和一些args,那么你将在你的java代码中有一个循环。不确定你的数组是什么样的(你不会给我那么多的东西),但如果它是由字符串组成的,那就是这样的:

//the query
String sql = "SELECT " + "*" +
                " FROM " + table + 
                " WHERE " + selection;

//create the statement
PreparedStatement stmt = connection.prepareStatement(sql);

//bind the values
for(int i = 0; i < selectionArgs.length; i++) {
    stmt.setString(i, selectionArgs[i]); //i is "the nth question mark"
}

//execute the query and get the result set back
ResultSet rs = stmt.executeQuery();

答案 2 :(得分:1)

您可以使用PreparedStatement吗?

答案 3 :(得分:1)

首先SELECT .. WHERE .. VALUES是不正确的SQL语法。丢失VALUES部分。

然后您正在寻找prepared statements

在你的例子中,它看起来像这样:

String sql = "SELECT * FROM myTable WHERE documentFK=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "myDocumentFK"); // parameters start from 1, not 0. also we're assuming the parameter type is String;
ResultSet rs = pstmt.executeQuery();

或者有多个参数:

String sql = "SELECT * FROM myTable WHERE documentFK=? AND indexTerm=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "myDocumentFK"); // parameters start from 1, not 0. also we're assuming the parameter type is String;
pstsm.setInt(2, 100); // assume indexTerm can be 100 and is an integer
ResultSet rs = pstmt.executeQuery();

但是,所有这些都不值得你花时间,因为你可以通过将值连接到语句中来做同样的事情。但要注意SQL注入,所以不要忘记逃避您传入数据库的参数。

PS:我打字的时间太长了。你已经有了答案: - )

答案 4 :(得分:0)

作为旁注,您可能需要查看此内容以防止SQL注入:

https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java

答案 5 :(得分:0)

Sormula可以从任意大小的java.util.Collection中使用“IN”运算符进行选择。你不写SQL。它使用正确的“?”数构建SQL SELECT查询参数。请参阅example 4