【问题标题】:Error with simple Parameterized Query - Java/ SQL简单参数化查询出错 - Java/SQL
【发布时间】:2011-03-30 19:17:11
【问题描述】:

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

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

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");

这个版本运行良好,在我的第一个示例中,我错过了参数化查询的要点还是我构造错误?

谢谢!

【问题讨论】:

    标签: java sql netbeans parameterized-query


    【解决方案1】:

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

    【讨论】:

    • 因此,如果我想返回一个包含表中所有结果的 ResultSet (SELECT * FROM person),如果不隐含地将其键入为字符串,就无法完成?
    • 如果您询问是否可以使用参数化查询概括 select * from ,答案是否定的。您需要为此使用专用 SQL 或构建您自己的通用版本的 select *。
    • 是的,我就是这个意思:),真可惜。我想这样做,以便我可以使用自执行最后一个命令以来所做的更改来更新我的 JTable,你知道比刷新表更好的方法吗?
    • 抱歉,这个问题太针对应用了。您可能会找到一个内置某种形式的数据轮询的库,但我认为我们当时离最初的问题还很远。
    【解决方案2】:

    如果您想要 PERSON 表中的所有行,您应该这样做:

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

    变量绑定不像上面提到的那样动态绑定表名。 如果您将表名作为变量传入您的方法,则可以按如下方式构建整个查询:

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

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

    【讨论】:

    • 感谢详细的示例,让事情变得更加清晰:)
    【解决方案3】:

    准备好的语句还是SQL,需要用合适的where子句构造;即其中 x = y。它们的一个优点是它们在第一次被看到时被 RDMS 解析,而不是每次发送时都会解析,这加快了使用不同绑定值执行相同查询的后续执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2016-01-07
      • 1970-01-01
      • 2021-11-12
      • 2012-06-09
      • 1970-01-01
      相关资源
      最近更新 更多