ParamSetterProvider.java

package org.itsallcode.jdbc.statement;

import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;

import org.itsallcode.jdbc.dialect.ColumnValueSetter;
import org.itsallcode.jdbc.dialect.DbDialect;

/**
 * This class creates and caches {@link ColumnValueSetter} based on an object's
 * type.
 */
public class ParamSetterProvider {
    private static final ColumnValueSetter<Object> GENERIC_SETTER = PreparedStatement::setObject;
    private final DbDialect dialect;
    private final Map<String, ColumnValueSetter<Object>> setters = new HashMap<>();

    /**
     * Create a new instance.
     * 
     * @param dialect database dialect
     */
    public ParamSetterProvider(final DbDialect dialect) {
        this.dialect = dialect;
    }

    @SuppressWarnings("unchecked")
    ColumnValueSetter<Object> findSetter(final Object object) {
        if (object == null) {
            return GENERIC_SETTER;
        }
        return setters.computeIfAbsent(object.getClass().getName(),
                type -> (ColumnValueSetter<Object>) dialect.createSetter(object.getClass()));
    }
}