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}