0

我有一个问题 - 我根据用户输入选项动态创建我的 SQL 查询。因此,用户有 5 个参数(实际上更多),他可以选择使用其中的一些(如果他愿意,可以全部使用)或不使用,并在查询中指定它们的值。因此,我通过检查是否选择了参数以及是否提供了值来构造我的查询字符串(基本的 WHERE 条件)。但是现在出现了特殊字符的问题,例如 '. 我可以尝试使用 replaceAll("'", "\\") 但这很乏味,我知道preparedStatement.setString() 做得更好。但是对我来说,我需要再次检查是否提供了参数以及前一个是否也提供了(指定 ? 的毒药并将其连接到正确的参数)。这会导致很多组合,看起来并不优雅。

所以我的问题是——我能以某种方式接收preparedStatement.setString() 产生的字符串吗?或者是否有类似的功能可以完成相同的工作并给我字符串,以便我可以手动将其放入查询中。

也许介绍太长了,但有人可能有更好的主意,我想解释一下为什么我需要它。

4

2 回答 2

0

在另一个论坛上,我得到了一种不同的、更简单、更干净的方法,而且效果很好。以下是其他有同样问题的人的一些链接:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID: 1669972300346534908 http://www.akadia.com /services/dyn_modify_where_clause.html

于 2012-01-11T13:15:56.337 回答
0

您可以做的是根据是否指定参数来构造基本的、未参数化的 SQL 查询,然后使用准备好的语句来填充参数。

它可能看起来像这样(粗略的草图):

Map<String, Object> parameterValues = /*from user*/;
List<String> parameterNames = Arrays.asList("field1", "field2", "field3");
List<Object> valueList = new ArrayList<Object>();

StringBuilder statementBuilder = new StringBuilder("select * from table where ");
for ( String parameterName : parameterNames ) {
    if ( parameterValues.containsKey(parameterName) ) {
        statementBuilder.append(parameterName + " = ? AND");
        valueList.add(parameterValues.get(parameterName));
    }
}

PreparedStatement st = conn.prepareStatement(statementBuilder.toString(), 
                       valueList);
//set each parameter here.

只是第一次很难;然后你可以让它通用。也就是说,可能有查询构建器可以为您抽象出所有这些。我使用 QueryDSL,但它没有纯 JDBC 的绑定,而是 JPA 和 JDO 等。

于 2012-01-11T04:24:24.910 回答