ConvertingPreparedStatement.java

package org.itsallcode.jdbc.statement;

import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * A {@link PreparedStatement} that delegates calls to
 * {@link #setObject(int, Object)} to a setter provided by
 * {@link ParamSetterProvider#findSetter(Object)}.
 */
public class ConvertingPreparedStatement extends DelegatingPreparedStatement {
    private final PreparedStatement originalDelegate;
    private final ParamSetterProvider paramSetterProvider;

    /**
     * Create a new instance.
     * 
     * @param delegate            delegate
     * @param paramSetterProvider parameter setter provider
     */
    public ConvertingPreparedStatement(final PreparedStatement delegate,
            final ParamSetterProvider paramSetterProvider) {
        super(delegate);
        this.originalDelegate = delegate;
        this.paramSetterProvider = paramSetterProvider;
    }

    @Override
    public void setObject(final int parameterIndex, final Object x) throws SQLException {
        paramSetterProvider.findSetter(x)
                .setObject(originalDelegate, parameterIndex, x);
    }
}