/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jdbi.v3.core.statement;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import org.jdbi.v3.core.argument.Argument;
import org.jdbi.v3.core.argument.NamedArgumentFinder;
import org.jdbi.v3.core.internal.JdbiOptionals;
Represents the arguments bound to a particular statement.
/** * Represents the arguments bound to a particular statement. */
public class Binding { private final Map<Integer, Argument> positionals = new HashMap<>(); private final Map<String, Argument> named = new HashMap<>(); private final List<NamedArgumentFinder> namedArgumentFinder = new ArrayList<>();
Bind a positional parameter at the given index (0-based).
Params:
  • position – binding position
  • argument – the argument to bind
/** * Bind a positional parameter at the given index (0-based). * @param position binding position * @param argument the argument to bind */
public void addPositional(int position, Argument argument) { positionals.put(position, argument); }
Bind a named parameter for the given name.
Params:
  • name – bound argument name
  • argument – the argument to bind
/** * Bind a named parameter for the given name. * @param name bound argument name * @param argument the argument to bind */
public void addNamed(String name, Argument argument) { this.named.put(name, argument); }
Bind a named argument finder.
Params:
  • args – the argument finder to bind
/** * Bind a named argument finder. * @param args the argument finder to bind */
public void addNamedArgumentFinder(NamedArgumentFinder args) { namedArgumentFinder.add(args); }
Look up an argument by name.
Params:
  • name – the key to lookup the value of
  • ctx – the statement context
Returns:the bound Argument
/** * Look up an argument by name. * * @param name the key to lookup the value of * @param ctx the statement context * * @return the bound Argument */
public Optional<Argument> findForName(String name, StatementContext ctx) { if (named.containsKey(name)) { return Optional.of(named.get(name)); } return namedArgumentFinder.stream() .flatMap(arguments -> JdbiOptionals.stream(arguments.find(name, ctx))) .findFirst(); }
Returns:the set of known binding names
/** * @return the set of known binding names */
public Collection<String> getNames() { final Set<String> names = new HashSet<>(named.keySet()); namedArgumentFinder.forEach(args -> names.addAll(args.getNames())); return Collections.unmodifiableSet(names); }
Look up an argument by position.
Params:
  • position – starts at 0, not 1
Returns:argument bound to that position
/** * Look up an argument by position. * * @param position starts at 0, not 1 * @return argument bound to that position */
public Optional<Argument> findForPosition(int position) { return Optional.ofNullable(positionals.get(position)); } @Override public String toString() { String positionals = this.positionals.entrySet().stream() .map(x -> x.getKey().toString() + ':' + x.getValue()) .collect(Collectors.joining(",")); String named = this.named.entrySet().stream() .map(x -> x.getKey() + ':' + x.getValue()) .collect(Collectors.joining(",")); String found = namedArgumentFinder.stream() .map(Object::toString) .collect(Collectors.joining(",")); return "{positional:{" + positionals + "}, named:{" + named + "}, finder:[" + found + "]}"; }
Remove all bindings from this Binding.
/** * Remove all bindings from this Binding. */
public void clear() { positionals.clear(); named.clear(); namedArgumentFinder.clear(); }
Returns:true if there are no bindings yet
/** * @return true if there are no bindings yet */
public boolean isEmpty() { return positionals.isEmpty() && named.isEmpty() && namedArgumentFinder.isEmpty(); } }