简单参数化查询出错 - Java / SQL

时间:2011-03-30 19:17:11

标签: java sql netbeans parameterized-query

继我之前提出的method design问题之后,我被建议将我的SQL查询实现为参数化查询,而不是简单的字符串。

之前我从未使用参数化查询,所以我决定从简单的开始,采取以下选择语句:

String select = "SELECT * FROM ? ";

PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "person");

这给了我以下错误:“[SQLITE_ERROR] SQL错误或缺少数据库(接近”?“:语法错误)”

然后我尝试了一个具有其他标准的修改版本;

String select = "SELECT id FROM person WHERE name = ? ";

PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "Yui");

这个版本工作正常,在我的第一个例子中,我错过了参数化查询的要点,还是我错误地构造它们?

谢谢!

3 个答案:

答案 0 :(得分:9)

简单地说,SQL绑定不能绑定表,只能绑定where子句值。有一些技术上的原因与“编译”准备好的SQL语句有关。通常,参数化查询旨在通过阻止SQL注入来使SQL更安全,并且它具有使查询更加“模块化”的附带好处,但不能达到能够动态设置表名的程度(因为它假设您已经知道桌子会是什么了。)

答案 1 :(得分:2)

如果您想要PERSON表中的所有行,请执行以下操作:

String select = "SELECT * FROM person";

PreparedStatement ps = connection.prepareStatement(select);

变量绑定不会像上面提到的那些动态绑定表名。 如果您将表名作为变量输入到您的方法中,则可以构造整个查询,如下所示:

String select = "SELECT * FROM " + varTableName;
PreparedStatement ps = connection.prepareStatement(select);

参数化查询用于查询字段名称 - 而不是表名!

答案 2 :(得分:1)

预备语句仍然是SQL,需要使用适当的where子句构造;即,其中x = y。它们的一个优点是它们在首次出现时由RDMS解析,而不是每次发送时都会被解析,从而加快了使用不同绑定值的相同查询的后续执行。