001package org.itsallcode.jdbc.statement;
002
003import java.sql.PreparedStatement;
004import java.util.HashMap;
005import java.util.Map;
006
007import org.itsallcode.jdbc.dialect.ColumnValueSetter;
008import org.itsallcode.jdbc.dialect.DbDialect;
009
010/**
011 * This class creates and caches {@link ColumnValueSetter} based on an object's
012 * type.
013 */
014public class ParamSetterProvider {
015    private static final ColumnValueSetter<Object> GENERIC_SETTER = PreparedStatement::setObject;
016    private final DbDialect dialect;
017    private final Map<String, ColumnValueSetter<Object>> setters = new HashMap<>();
018
019    /**
020     * Create a new instance.
021     * 
022     * @param dialect database dialect
023     */
024    public ParamSetterProvider(final DbDialect dialect) {
025        this.dialect = dialect;
026    }
027
028    @SuppressWarnings("unchecked")
029    ColumnValueSetter<Object> findSetter(final Object object) {
030        if (object == null) {
031            return GENERIC_SETTER;
032        }
033        return setters.computeIfAbsent(object.getClass().getName(),
034                type -> (ColumnValueSetter<Object>) dialect.createSetter(object.getClass()));
035    }
036}