gpt4 book ai didi

java - ReadyStatement 多个替换,不带逗号分隔符

转载 作者:行者123 更新时间:2023-12-01 07:11:48 24 4
gpt4 key购买 nike

我有以下PreparedStatement:

  PreparedStatement statement = conn.prepareStatement("Select * from foo 
where foo.age ? ? AND foo.children ? ?")

现在解释一下我想要做什么,因为我很懒并且不喜欢编写多个查询。我希望语句完成后如下所示:

Select * from foo where foo.age >= 42 AND foo.children <= 3

或者

Select * from foo where foo.age = 42 AND foo.children = 3

如果不清楚,我希望能够连续替换多个标记,其中第一个标记恰好是限定符(等于、大于、小于等),而后面的标记恰好是文字(3,17,“史蒂夫”等)。我的问题是这可能吗?如果可能的话如何实现?

最佳答案

您不能这样做,因为 ? 不代表 token ,而是代表。显然,某些标记(即文字)表示值,但即使对于这些标记,? 也直接表示值本身,而不是也表示值的文字。 (这是设计的一个有意的元素,因为参数化查询的真正目的是防止参数“泄漏”并被解释为除单个值之外的其他内容。)

<小时/>

编辑添加:在我工作的地方,我们有一个自定义框架,它封装了 JDBC 并处理事务等,因此我们通常不必处理直接使用 PreparedStatement 。该框架有一个如下所示的方法:

public <T> Iterator<T> executeQuery(ConverterFromResultSetToT<T> converter,
String query, Map<String, Object> params)
{
// . . . modify query, replacing any instances of $!{paramKey} with the
// corresponding value from params -- this allows arbitrary SQL code
// to be injected, in the rare cases that that's necessary

// . . . modify query, replacing any instances of ${paramKey} with '?' and
// adding the corresponding value from params to an array -- we use
// this much more often

// . . . create PreparedStatement with the resulting query

// . . . set parameters of PreparedStatement from aforemented array

// . . . run PreparedStatement; wrap result in an Iterator<T>; and return
}

但如果您希望做很多这样的事情,我只会推荐这种事情。我们在该框架上投入了大量精力,它非常有用,但它也包含大量代码。

<小时/>

值得注意的是,无论文档可能暗示什么,创建 PreparedStatement 的成本并不是很高。除非您确实多次运行相同的查询,否则每次都重新创建 PreparedStatement 也没什么大不了的。因此,只要您愿意为此编写自己的代码,您实际上并不需要对嵌入式运算符的内置支持。

关于java - ReadyStatement 多个替换,不带逗号分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com