Repository: camel Updated Branches: refs/heads/camel-2.12.x 563d143d4 -> 4c62b2e4a refs/heads/camel-2.13.x b4e769ee3 -> 324669312 refs/heads/master 236c8e5d9 -> c1522c1a1
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. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c1522c1a Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c1522c1a Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c1522c1a Branch: refs/heads/master Commit: c1522c1a109ba58891a1e50af05e93a1a5017209 Parents: 236c8e5 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:24:09 2014 +0200 ---------------------------------------------------------------------- .../sql/DefaultSqlPrepareStatementStrategy.java | 30 ++++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/c1522c1a/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 4b1b2d5..b46714e 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 @@ -33,6 +33,7 @@ import org.apache.camel.language.simple.SimpleLanguage; 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. @@ -91,19 +92,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) { @@ -131,7 +143,7 @@ public class DefaultSqlPrepareStatementStrategy implements SqlPrepareStatementSt private static final class PopulateIterator implements Iterator<Object> { private static final String MISSING_PARAMETER_EXCEPTION = - "Cannot find key [%s] in message body or headers to use when setting named parameter in query [%s]"; + "Cannot find key [%s] in message body or headers to use when setting named parameter in query [%s]"; private final String query; private final NamedQueryParser parser; private final Exchange exchange;