private static void bindNamed(ParsedParameters params, Binding binding, PreparedStatement statement, StatementContext context) { List<String> paramNames = params.getParameterNames(); // best effort: compare empty to non-empty because we can't list the individual binding names (unless we expose a method to do so) boolean argumentsProvidedButNoneDeclared = paramNames.isEmpty() && !binding.isEmpty(); if (argumentsProvidedButNoneDeclared && !context.getConfig(SqlStatements.class).isUnusedBindingAllowed()) { throw new UnableToCreateStatementException(String.format( "Superfluous named parameters provided while the query " + "declares none: '%s'. This check may be disabled by calling " + "getConfig(SqlStatements.class).setUnusedBindingAllowed(true) " + "or using @AllowUnusedBindings in SQL object.", binding), context); } for (int i = 0; i < paramNames.size(); i++) { final String name = paramNames.get(i); try { binding.findForName(name, context) .orElseThrow(() -> new UnableToCreateStatementException(String.format("Missing named parameter '%s'.", name), context)) .apply(i + 1, statement, context); } catch (SQLException e) { throw new UnableToCreateStatementException(String.format("Exception while binding named parameter '%s'", name), 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("?"); } }
@Test public void testFactoryNamedParameters() { final List<String> names = Arrays.asList("a", "b", "c"); final String sql = "insert into test (a, b, c) values (?, ?, ?)"; final ParsedParameters parameters = ParsedParameters.named(names); final ParsedSql parsedSql = ParsedSql.of(sql, parameters); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo(sql); assertThat(parsedSql.getParameters().isPositional()).isFalse(); assertThat(parsedSql.getParameters().getParameterNames()).containsExactly("a", "b", "c"); }
@Test public void testFactoryPositionalParameters() { final String sql = "insert into test (a, b, c) values (?, ?, ?)"; final ParsedParameters parameters = ParsedParameters.positional(3); final ParsedSql parsedSql = ParsedSql.of(sql, parameters); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo(sql); assertThat(parsedSql.getParameters().isPositional()).isTrue(); assertThat(parsedSql.getParameters().getParameterNames()).containsOnly("?"); }
@Test public void testBuilderWithNamedParameters() { final List<String> names = Arrays.asList("a", "b", "c"); final ParsedSql parsedSql = ParsedSql.builder() .append("insert into test (a, b, c) values (") .appendNamedParameter(names.get(0)) .append(", ") .appendNamedParameter(names.get(1)) .append(", ") .appendNamedParameter(names.get(2)) .append(")") .build(); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo("insert into test (a, b, c) values (?, ?, ?)"); assertThat(parsedSql.getParameters().isPositional()).isFalse(); assertThat(parsedSql.getParameters().getParameterNames()).containsExactly("a", "b", "c"); }
@Test public void testBuilderWithPositionalParameters() { final ParsedSql parsedSql = ParsedSql.builder() .append("insert into test (a, b, c) values (") .appendPositionalParameter() .append(", ") .appendPositionalParameter() .append(", ") .appendPositionalParameter() .append(")") .build(); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo("insert into test (a, b, c) values (?, ?, ?)"); assertThat(parsedSql.getParameters().isPositional()).isTrue(); assertThat(parsedSql.getParameters().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); } }