我可以从preparedStatem.setString()获取字符串吗?

时间:2012-01-10 23:33:07

标签: java prepared-statement setstring

我遇到了问题 - 我动态创建SQL查询并基于用户输入选项。所以用户有5个参数(实际上它更多),他可以选择使用其中的一些(如果他想要的话)或者没有,并在查询中指定它们的值。所以我通过检查是否选择了参数以及是否提供了值来构造我的查询字符串(基本的WHERE条件)。但是现在存在像''这样的特殊字符的问题。我可以尝试使用replaceAll(“'”,“\\”),但这非常沉闷,我知道preparedStatement.setString()可以更好地完成工作。但是对我来说,我需要再次检查是否提供了参数以及前一个参数是否也是(指定?的毒性并将其连接到正确的参数)。这导致许多组合并且看起来不优雅。

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

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

2 个答案:

答案 0 :(得分: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等

答案 1 :(得分: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