【问题标题】:Using a variable instead of a parameter index with a JDBC prepared statement通过 JDBC 准备语句使用变量而不是参数索引
【发布时间】:2010-11-09 00:44:28
【问题描述】:

在许多编程语言中,对于准备好的语句来说,类似这样的事情是可能的:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}");
statement.setString("name", "IBM");

但不适用于 java.sql.PreparedStatement。在 Java 中必须使用参数索引:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?");
statement.setString(1, "IBM");

是否有像第一个示例中那样使用字符串变量的解决方案? “${.*}” 没有在 SQL 语言的其他地方使用,还是有任何冲突?因为然后我会自己实现它(解析 SQL 字符串并用“?”替换每个变量,然后以 Java 方式执行)。

问候, 启

【问题讨论】:

  • 嘿 kd304,我想知道你为什么不留下你的消息作为答案而不是使用评论。因为我认为这是我解决这个问题的方法。
  • @tokel:我不确定你的问题是否是理论上的,我的评论并没有真正回答你输入的问题。
  • 尽管...谢谢 :-)
  • “在 Java 中必须使用参数索引:” - 实际上,在您的示例中看起来并不像这样。在 Java 中,甚至不能在 SQL 字符串中使用参数索引。

标签: java jdbc


【解决方案1】:

正如我帖子的评论中提到的 kd304,如果您不想将另一个 3rd 方库(如 Spring)合并到您的项目中,这是一个非常好的解决方案:Javaworld Article: Named Parameters for PreparedStatement

【讨论】:

    【解决方案2】:

    标准 JDBC PreparedStatements 不具备此功能。 Spring JDBC 通过NamedParameterJdbcTemplate 提供了这个功能。

    【讨论】:

    • 感谢您提供非常好的解决方案。对我来说问题是它将成为另一个开源框架的一部分,我不想在那里导入这么多代码。否则我会使用你的解决方案:-)
    【解决方案3】:

    如您所说,使用原始 PreparedStatement 是不可能的。使用 CallableStatement 是可能的,但这需要一个存储过程,而不仅仅是一条 SQL 语句。

    像 Hibernate 这样的 ORM 层也提供命名参数替换,而且 Hibernate 还允许您执行原生 SQL,完全绕过 OR 映射功能。

    因此,如果您真的热衷于使用命名参数,您可以使用 Hibernate 作为这样做的一种方式;你只会使用它的一小部分功能。

    【讨论】:

    • 忘记我的想法,@laz 有一个更好的想法。
    • 我认为 Oracle JDBC 驱动程序支持在使用 CallableStatement 时使用命名参数调用常规 SQL 语句,而不仅仅是过程。 PostgreSQL 说“尚未实现”(postgresql-9.1-901.jdbc4.jar)
    • 太可悲了,因为 DBMS 支持这一点,至少 SQL 服务器支持,并且 JSBC 内部创建命名参数,如下所示:@P0 nvarchar(4000),@P1 varchar(8000),@P2 nvarchar(4000),@P3 smallint,@P4 nvarchar(4000),@P5 int
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2011-09-14
    • 2016-05-22
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    相关资源
    最近更新 更多