docs: public void setObject(final int parameterIndex, final Object obj) throws SQLException {
      if (obj == null) {
        setNull(parameterIndex, Types.INTEGER);
      } else if (obj instanceof String) {
        setString(parameterIndex, (String) obj);
      } else if (obj instanceof Integer) {
        setInt(parameterIndex, (Integer) obj);
      } else if (obj instanceof Long) {
        setLong(parameterIndex, (Long) obj);
      } else if (obj instanceof Short) {
        setShort(parameterIndex, (Short) obj);
      } else if (obj instanceof Double) {
        setDouble(parameterIndex, (Double) obj);
      } else if (obj instanceof Float) {
        setFloat(parameterIndex, (Float) obj);
      } else if (obj instanceof Byte) {
        setByte(parameterIndex, (Byte) obj);
      } else if (obj instanceof byte[]) {
        setBytes(parameterIndex, (byte[]) obj);
      } else if (obj instanceof Date) {
        setDate(parameterIndex, (Date) obj);
      } else if (obj instanceof Time) {
        setTime(parameterIndex, (Time) obj);
      } else if (obj instanceof Timestamp) {
        setTimestamp(parameterIndex, (Timestamp) obj);
      } else if (obj instanceof java.util.Date) {
        setTimestamp(parameterIndex, new Timestamp(((java.util.Date) obj).getTime()));
      } else if (obj instanceof Boolean) {
        setBoolean(parameterIndex, (Boolean) obj);
      } else if (obj instanceof Blob) {
        setBlob(parameterIndex, (Blob) obj);
      } else if (obj instanceof InputStream) {
        setBinaryStream(parameterIndex, (InputStream) obj);
      } else if (obj instanceof Reader) {
        setCharacterStream(parameterIndex, (Reader) obj);
      } else if (obj instanceof BigDecimal) {
        setBigDecimal(parameterIndex, (BigDecimal) obj);
      } else if (obj instanceof BigInteger) {
        setString(parameterIndex, obj.toString());
      } else if (obj instanceof Clob) {
        setClob(parameterIndex, (Clob) obj);
      } else if (obj instanceof LocalDateTime) {
        setTimestamp(parameterIndex, Timestamp.valueOf((LocalDateTime) obj));
      } else if (obj instanceof Instant) {
        setTimestamp(parameterIndex, Timestamp.from((Instant) obj));
      } else if (obj instanceof LocalDate) {
        setDate(parameterIndex, Date.valueOf((LocalDate) obj));
      } else if (obj instanceof OffsetDateTime) {
        setParameter(parameterIndex,
            new ZonedDateTimeParameter(
                ((OffsetDateTime) obj).toZonedDateTime(),
                protocol.getTimeZone().toZoneId(),
                useFractionalSeconds,
                options));
      } else if (obj instanceof OffsetTime) {
        setParameter(parameterIndex,
            new OffsetTimeParameter(
                    (OffsetTime) obj,
                protocol.getTimeZone().toZoneId(),
                useFractionalSeconds,
                options));
      } else if (obj instanceof ZonedDateTime) {
        setParameter(parameterIndex,
            new ZonedDateTimeParameter(
                    (ZonedDateTime) obj,
                protocol.getTimeZone().toZoneId(),
                useFractionalSeconds,
                options));
      } else if (obj instanceof LocalTime) {
        setTime(parameterIndex, Time.valueOf((LocalTime) obj));
      } else {
        //fallback to sending serialized object
        setParameter(parameterIndex, new SerializableParameter(obj, noBackslashEscapes));
        hasLongData = true;
      }
    }