CAMEL-7653: camel-sql, set prepared statement arguments using a setter that deals with various JDBC driver differences with setObject vs setInteger/setString etc. Thanks to Jo Geraerts for the patch.
Conflicts: components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/32466931 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/32466931 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/32466931 Branch: refs/heads/camel-2.13.x Commit: 32466931248af75e5b66a6bcc32e66eb9088c8e9 Parents: b4e769e Author: Claus Ibsen <davscl...@apache.org> Authored: Mon Aug 4 09:24:09 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Mon Aug 4 09:26:00 2014 +0200 ---------------------------------------------------------------------- .../sql/DefaultSqlPrepareStatementStrategy.java | 28 ++++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/32466931/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java index 0ffac39..87221c5 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java @@ -32,6 +32,7 @@ import org.apache.camel.RuntimeExchangeException; import org.apache.camel.util.StringQuoteHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.ArgumentPreparedStatementSetter; /** * Default {@link SqlPrepareStatementStrategy} that supports named query parameters as well index based. @@ -146,19 +147,30 @@ public class DefaultSqlPrepareStatementStrategy implements SqlPrepareStatementSt @Override public void populateStatement(PreparedStatement ps, Iterator<?> iterator, int expectedParams) throws SQLException { + if (expectedParams <= 0) { + return; + } + + final Object[] args = new Object[expectedParams]; + int i = 0; int argNumber = 1; - if (expectedParams > 0) { - while (iterator != null && iterator.hasNext()) { - Object value = iterator.next(); - LOG.trace("Setting parameter #{} with value: {}", argNumber, value); - ps.setObject(argNumber, value); - argNumber++; + + while (iterator != null && iterator.hasNext()) { + Object value = iterator.next(); + LOG.trace("Setting parameter #{} with value: {}", argNumber, value); + if (argNumber <= expectedParams) { + args[i] = value; } + argNumber++; + i++; } - if (argNumber - 1 != expectedParams) { - throw new SQLException("Number of parameters mismatch. Expected: " + expectedParams + ", was:" + (argNumber - 1)); + throw new SQLException("Number of parameters mismatch. Expected: " + expectedParams + ", was: " + (argNumber - 1)); } + + // use argument setter as it deals with various JDBC drivers setObject vs setLong/setInteger/setString etc. + ArgumentPreparedStatementSetter setter = new ArgumentPreparedStatementSetter(args); + setter.setValues(ps); } protected boolean hasNamedParameters(String query) {