【问题标题】:Java MessageFormat - How can I insert values between single quotes?Java MessageFormat - 如何在单引号之间插入值?
【发布时间】:2010-09-16 10:27:22
【问题描述】:

我在使用 java.text.MessageFormat 对象时遇到问题。

我正在尝试创建 SQL 插入语句。问题是,当我做这样的事情时:

MessageFormat messageFormat = "insert into {0} values ( '{1}', '{2}', '{3}', {4} )";
Object[] args = { str0, str1, str2, str3, str4 };
String result = messageFormat.format(args);

我以result 的价值得到这个:

"insert into <str0> values ( {1}, {2}, {3}, <str4> )"

如您所见,问题在于任何用单引号括起来的目标位置都不会被参数替换。我尝试过使用像这样的双单引号:''{1}'' 和像这样的转义字符:\'{1}\',但它仍然给出相同的结果。

编辑:我忘了提到我也试过'''{1}'''。结果是:"insert into &lt;str0&gt; values ( '{1}', '{2}', '{3}', &lt;str4&gt; )"。它保留了原始引号,但仍未插入值。

我该如何解决这个问题?作为记录,我使用的是 JDK 6u7。

【问题讨论】:

  • 事实证明''{0}'' 确实有效。我只需要彻底清理我的构建目录,因为我的构建过程没有正确更新而且我没有意识到这一点。糟糕!
  • This answer 解释了需要额外报价的原因。

标签: java


【解决方案1】:

我刚刚尝试了双引号,对我来说效果很好:

MessageFormat messageFormat = new MessageFormat("insert into {0} values ( ''{1}'', ''{2}'', ''{3}'', {4} )");
Object[] args = {"000", "111", "222","333","444","555"};
String result = messageFormat.format(args);

结果是:

insert into 000 values ( '111', '222', '333', 444 )

这是你需要的吗?

【讨论】:

  • 我以前试过这个,但没有用。构建过程出了点问题……在完全清理 -> 重建之后,这种方法奏效了! 呻吟。谢谢!
【解决方案2】:

很抱歉,这有点不对劲,但您似乎正在尝试复制已在 JDBC 中的 PreparedStatement。

如果您尝试创建 SQL 以针对数据库运行,那么我建议您查看 PreparedStatement,它已经完成了您尝试执行的操作(语法略有不同)。

对不起,如果这不是你在做什么,我只是想我会指出这一点。

【讨论】:

    【解决方案3】:

    字符串中,一对单引号可用于引用除单引号外的任意字符。例如,模式字符串"'{0}'" 表示字符串"{0}",而不是FormatElement。单引号本身必须在整个String 中用双引号'' 表示。例如,模式字符串"'{''}'" 被解释为'{(引号开头和左大括号)、''(单引号)和}'(右大括号和引号结尾)的序列), not '{''}'(带引号的左右大括号):代表字符串"{'}"not "{}"

    发件人:MessageFormat (Java Platform SE 8 )

    【讨论】:

    • 谢谢。我已经在 J​​ava 文档中读到了这个,但我很困惑(并且无法从中得到我想要的东西),尽管我做错的可能性很大。需要详细说明吗?
    • 我认为重要的部分是:“单引号本身必须在整个字符串中用双引号 '' 表示” - 其余部分仅说明如何组合解析单引号和花括号。相当的一句话……
    • 这应该是正确的答案,因为它解释了为什么单引号需要加倍。
    【解决方案4】:

    使用三重单引号:

    MessageFormat messageFormat = "insert into {0} values ( '''{1}''', '''{2}''', '''{3}''', '''{4}''' )";
    

    【讨论】:

    • 这只会导致"insert into &lt;str0&gt; values ( '{1}', '{2}', '{3}', &lt;str4&gt; )"。所以它现在有单引号,但参数值仍然没有被插入。
    【解决方案5】:

    首先想到的是将 str1、str2、str3 更改为在它们周围加上单引号。

    对象[] args = { str0, "'" + str1 + "'", "'" + str2 + "'", "'" + str3 + "'", str4 };

    当然,从查询字符串中删除单引号。

    【讨论】:

    • 谢谢。这是我目前的解决方法,但我更喜欢更快/更清洁的方法。
    猜你喜欢
    • 2013-07-06
    • 2016-10-21
    • 2010-12-27
    • 2011-03-09
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多