BindParameter.java

package li.selman.persistencetest.core;

import org.jspecify.annotations.Nullable;

/**
 * A single bind parameter of a captured statement.
 *
 * @param position 1-based JDBC parameter index, matching {@link java.sql.PreparedStatement} conventions.
 * @param value the bound value as passed to the driver; {@code null} for a bound SQL {@code NULL}.
 * @param typeName the driver/Java type name of the value (e.g. {@code "java.lang.String"}), when known.
 */
public record BindParameter(
        int position, @Nullable Object value, @Nullable String typeName) {

    public BindParameter {
        if (position < 1) {
            throw new IllegalArgumentException("position must be 1-based (>= 1), got " + position);
        }
    }

    /**
     * Creates a parameter with its type name derived from {@code value}'s runtime class, or {@code null} if
     * {@code value} is {@code null}.
     */
    public static BindParameter of(int position, @Nullable Object value) {
        String typeName = value == null ? null : value.getClass().getName();
        return new BindParameter(position, value, typeName);
    }
}