private static void bindPositional(ParsedParameters params, Binding binding, PreparedStatement statement, StatementContext context) { // best effort: just try +1 (unless we expose a method to get the full binding count) boolean moreArgumentsProvidedThanDeclared = binding.findForPosition(params.getParameterCount()).isPresent(); if (moreArgumentsProvidedThanDeclared && !context.getConfig(SqlStatements.class).isUnusedBindingAllowed()) { throw new UnableToCreateStatementException("Superfluous positional param at (0 based) position " + params.getParameterCount(), context); } for (int i = 0; i < params.getParameterCount(); i++) { final int index = i; try { binding.findForPosition(i) .orElseThrow(() -> new UnableToCreateStatementException("Missing positional param at (0 based) position " + index, context)) .apply(i + 1, statement, context); } catch (SQLException e) { throw new UnableToCreateStatementException("Exception while binding positional param at (0 based) position " + i, e, context); } } }
@Test public void testFactoryNamedParameters() { final List<String> names = Arrays.asList("a", "b", "c"); final ParsedParameters parameters = ParsedParameters.named(names); assertThat(parameters).isNotNull(); assertThat(parameters.isPositional()).isFalse(); assertThat(parameters.getParameterCount()).isEqualTo(3); assertThat(parameters.getParameterNames()).containsExactly("a", "b", "c"); }
@Test public void testFactoryPositionalParameters() { final ParsedParameters parameters = ParsedParameters.positional(3); assertThat(parameters).isNotNull(); assertThat(parameters.isPositional()).isTrue(); assertThat(parameters.getParameterCount()).isEqualTo(3); assertThat(parameters.getParameterNames()).containsOnly("?"); } }
static void bind(ParsedParameters parameters, Binding binding, PreparedStatement statement, StatementContext context) { if (parameters.isPositional()) { bindPositional(parameters.getParameterCount(), binding, statement, context); } else { bindNamed(parameters.getParameterNames(), binding, statement, context); } }