All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mariadb.jdbc.BasePreparedStatement Maven / Gradle / Ivy

// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab

package org.mariadb.jdbc;

import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.sql.Date;
import java.sql.ParameterMetaData;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import org.mariadb.jdbc.client.ColumnDecoder;
import org.mariadb.jdbc.client.util.Parameters;
import org.mariadb.jdbc.codec.*;
import org.mariadb.jdbc.export.ExceptionFactory;
import org.mariadb.jdbc.export.Prepare;
import org.mariadb.jdbc.plugin.Codec;
import org.mariadb.jdbc.plugin.codec.*;
import org.mariadb.jdbc.util.ParameterList;

/** Common methods for prepare statement, for client and server prepare statement. */
public abstract class BasePreparedStatement extends Statement implements PreparedStatement {

  /** parameters */
  protected Parameters parameters;

  /** batching parameters */
  protected List batchParameters;

  /** prepare statement sql command */
  protected final String sql;

  /** PREPARE command result */
  protected Prepare prepareResult = null;

  /**
   * Constructor
   *
   * @param sql sql command
   * @param con connection
   * @param lock thread safe lock
   * @param canUseServerTimeout indicate if server can support server timeout
   * @param canUseServerMaxRows indicate if server can support max rows
   * @param autoGeneratedKeys indicate if automatif generated key retrival is required
   * @param resultSetType resultset type
   * @param resultSetConcurrency resultset concurrency
   * @param defaultFetchSize default fetch size
   */
  public BasePreparedStatement(
      String sql,
      Connection con,
      ReentrantLock lock,
      boolean canUseServerTimeout,
      boolean canUseServerMaxRows,
      int autoGeneratedKeys,
      int resultSetType,
      int resultSetConcurrency,
      int defaultFetchSize) {
    super(
        con,
        lock,
        canUseServerTimeout,
        canUseServerMaxRows,
        autoGeneratedKeys,
        resultSetType,
        resultSetConcurrency,
        defaultFetchSize);
    this.sql = sql;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("sql:'" + sql + "'");
    sb.append(", parameters:[");
    for (int i = 0; i < parameters.size(); i++) {
      org.mariadb.jdbc.client.util.Parameter param = parameters.get(i);
      if (param == null) {
        sb.append("null");
      } else {
        sb.append(param.bestEffortStringValue(con.getContext()));
      }
      if (i != parameters.size() - 1) {
        sb.append(",");
      }
    }
    sb.append("]");
    return sb.toString();
  }

  /**
   * Set PREPARE result
   *
   * @param prepareResult prepare result
   */
  public void setPrepareResult(Prepare prepareResult) {
    this.prepareResult = prepareResult;
  }

  /**
   * Get cached metadata list
   *
   * @return metadata list
   */
  public ColumnDecoder[] getMeta() {
    return this.prepareResult.getColumns();
  }

  /**
   * update cached metadata list
   *
   * @param ci metadata columns
   */
  public void updateMeta(ColumnDecoder[] ci) {
    this.prepareResult.setColumns(ci);
  }

  public abstract boolean execute() throws SQLException;

  public abstract ResultSet executeQuery() throws SQLException;

  public abstract int executeUpdate() throws SQLException;

  public abstract long executeLargeUpdate() throws SQLException;

  public abstract void addBatch() throws SQLException;

  public abstract ResultSetMetaData getMetaData() throws SQLException;

  public abstract ParameterMetaData getParameterMetaData() throws SQLException;

  /**
   * Set all parameters
   *
   * @param parameters parameters
   */
  public void setParameters(Parameters parameters) {
    this.parameters = parameters;
  }

  /**
   * Set parameter
   *
   * @param index parameter index
   * @param param parameter
   */
  public void setParameter(int index, org.mariadb.jdbc.client.util.Parameter param) {
    parameters.set(index, param);
  }

  @Override
  public abstract int[] executeBatch() throws SQLException;

  @Override
  public abstract long[] executeLargeBatch() throws SQLException;

  // ***************************************************************************************************
  // methods inherited from Statement that are disabled
  // ***************************************************************************************************

  @Override
  public void addBatch(String sql) throws SQLException {
    throw exceptionFactory().create("addBatch(String sql) cannot be called on preparedStatement");
  }

  @Override
  public boolean execute(String sql) throws SQLException {
    throw exceptionFactory().create("execute(String sql) cannot be called on preparedStatement");
  }

  @Override
  public boolean execute(String sql, int autoGeneratedKeys) throws SQLException {
    throw exceptionFactory()
        .create("execute(String sql, int autoGeneratedKeys) cannot be called on preparedStatement");
  }

  @Override
  public boolean execute(String sql, int[] columnIndexes) throws SQLException {
    throw exceptionFactory()
        .create("execute(String sql, int[] columnIndexes) cannot be called on preparedStatement");
  }

  @Override
  public boolean execute(String sql, String[] columnNames) throws SQLException {
    throw exceptionFactory()
        .create("execute(String sql, String[] columnNames) cannot be called on preparedStatement");
  }

  @Override
  public ResultSet executeQuery(String sql) throws SQLException {
    throw exceptionFactory()
        .create("executeQuery(String sql) cannot be called on preparedStatement");
  }

  @Override
  public int executeUpdate(String sql) throws SQLException {
    throw exceptionFactory()
        .create("executeUpdate(String sql) cannot be called on preparedStatement");
  }

  @Override
  public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
    throw exceptionFactory()
        .create(
            "executeUpdate(String sql, int autoGeneratedKeys) cannot be called on preparedStatement");
  }

  @Override
  public int executeUpdate(String sql, int[] columnIndexes) throws SQLException {
    throw exceptionFactory()
        .create(
            "executeUpdate(String sql, int[] columnIndexes) cannot be called on preparedStatement");
  }

  @Override
  public int executeUpdate(String sql, String[] columnNames) throws SQLException {
    throw exceptionFactory()
        .create(
            "executeUpdate(String sql, String[] columnNames) cannot be called on preparedStatement");
  }

  @Override
  public long executeLargeUpdate(String sql) throws SQLException {
    throw exceptionFactory()
        .create("executeLargeUpdate(String sql) cannot be called on preparedStatement");
  }

  @Override
  public long executeLargeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
    throw exceptionFactory()
        .create(
            "executeLargeUpdate(String sql, int autoGeneratedKeys) cannot be called on preparedStatement");
  }

  @Override
  public long executeLargeUpdate(String sql, int[] columnIndexes) throws SQLException {
    throw exceptionFactory()
        .create(
            "executeLargeUpdate(String sql, int[] columnIndexes) cannot be called on preparedStatement");
  }

  @Override
  public long executeLargeUpdate(String sql, String[] columnNames) throws SQLException {
    throw exceptionFactory()
        .create(
            "executeLargeUpdate(String sql, String[] columnNames) cannot be called on preparedStatement");
  }

  // ***************************************************************************************************
  // Setters
  // ***************************************************************************************************

  private void checkIndex(int index) throws SQLException {
    if (index <= 0) {
      throw exceptionFactory().create(String.format("wrong parameter index %s", index));
    }
  }

  /**
   * Sets the designated parameter to SQL NULL.
   *
   * 

Note: You must specify the parameter's SQL type. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param sqlType the SQL type code defined in java.sql.Types * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if sqlType is a ARRAY, * BLOB, CLOB, DATALINK, JAVA_OBJECT, * NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML or STRUCT data type and * the JDBC driver does not support this data type */ @Override public void setNull(int parameterIndex, int sqlType) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, Parameter.NULL_PARAMETER); } /** * Sets the designated parameter to the given Java boolean value. The driver converts * this to an SQL BIT or BOOLEAN value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setBoolean(int parameterIndex, boolean x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new NonNullParameter<>(BooleanCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java byte value. The driver converts * this to an SQL TINYINT value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setByte(int parameterIndex, byte x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new NonNullParameter<>(ByteCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java short value. The driver converts * this to an SQL SMALLINT value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setShort(int parameterIndex, short x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new NonNullParameter<>(ShortCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java int value. The driver converts * this to an SQL INTEGER value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setInt(int parameterIndex, int x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new NonNullParameter<>(IntCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java long value. The driver converts * this to an SQL BIGINT value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setLong(int parameterIndex, long x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new NonNullParameter<>(LongCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java float value. The driver converts * this to an SQL REAL value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setFloat(int parameterIndex, float x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new NonNullParameter<>(FloatCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java double value. The driver converts * this to an SQL DOUBLE value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setDouble(int parameterIndex, double x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new NonNullParameter<>(DoubleCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given java.math.BigDecimal value. The driver * converts this to an SQL NUMERIC value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(BigDecimalCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java String value. The driver converts * this to an SQL VARCHAR or LONGVARCHAR value (depending on the * argument's size relative to the driver's limits on VARCHAR values) when it sends * it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setString(int parameterIndex, String x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StringCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Java array of bytes. The driver converts this to an * SQL VARBINARY or LONGVARBINARY (depending on the argument's size * relative to the driver's limits on VARBINARY values) when it sends it to the * database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setBytes(int parameterIndex, byte[] x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ByteArrayCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given java.sql.Date value using the default * time zone of the virtual machine that is running the application. The driver converts this to * an SQL DATE value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setDate(int parameterIndex, Date x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(DateCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given java.sql.Time value. The driver * converts this to an SQL TIME value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setTime(int parameterIndex, Time x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(TimeCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given java.sql.Timestamp value. The driver * converts this to an SQL TIMESTAMP value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(TimestampCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given input stream, which will have the specified number * of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it * may be more practical to send it via a java.io.InputStream. Data will be read from * the stream as needed until end-of-file is reached. The JDBC driver will do any necessary * conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the Java input stream that contains the ASCII parameter value * @param length the number of bytes in the stream * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, x, (long) length)); } /** * Sets the designated parameter to the given input stream, which will have the specified number * of bytes. * *

When a very large Unicode value is input to a LONGVARCHAR parameter, it may be * more practical to send it via a java.io.InputStream object. The data will be read * from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary * conversion from Unicode to the database char format. * *

The byte format of the Unicode stream must be a Java UTF-8, as defined in the Java Virtual * Machine Specification. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x a java.io.InputStream object that contains the Unicode parameter value * @param length the number of bytes in the stream * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @deprecated Use {@code setCharacterStream} */ @Override @Deprecated public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, x, (long) length)); } /** * Sets the designated parameter to the given input stream, which will have the specified number * of bytes. When a very large binary value is input to a LONGVARBINARY parameter, it * may be more practical to send it via a java.io.InputStream object. The data will * be read from the stream as needed until end-of-file is reached. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java input stream which contains the binary parameter value * @param length the number of bytes in the stream * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, x, (long) length)); } /** * Clears the current parameter values immediately. * *

In general, parameter values remain in force for repeated use of a statement. Setting a * parameter value automatically clears its previous value. However, in some cases it is useful to * immediately release the resources used by the current parameter values; this can be done by * calling the method clearParameters. * * @throws SQLException if a database access error occurs or this method is called on a closed * PreparedStatement */ @Override public void clearParameters() throws SQLException { checkNotClosed(); parameters = new ParameterList(); } /** * Sets the value of the designated parameter with the given object. * *

This method is similar to {@link #setObject(int parameterIndex, Object x, int targetSqlType, * int scaleOrLength)}, except that it assumes a scale of zero. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @param targetSqlType the SQL type (as defined in java.sql.Types) to be sent to the database * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified * targetSqlType * @see Types */ @Override public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { setInternalObject(parameterIndex, x, targetSqlType, null); } /** * Sets the value of the designated parameter using the given object. * *

The JDBC specification specifies a standard mapping from Java Object types to * SQL types. The given argument will be converted to the corresponding SQL type before being sent * to the database. * *

Note that this method may be used to pass datatabase- specific abstract data types, by using * a driver-specific Java type. * *

If the object is of a class implementing the interface SQLData, the JDBC driver * should call the method SQLData.writeSQL to write it to the SQL data stream. If, on * the other hand, the object is of a class implementing Ref, Blob, * Clob, NClob, Struct, java.net.URL, * RowId, SQLXML or Array, the driver should pass it to the * database as a value of the corresponding SQL type. * *

Note: Not all databases allow for a non-typed Null to be sent to the backend. For * maximum portability, the setNull or the * setObject(int parameterIndex, Object x, int sqlType) method should be used instead of * setObject(int parameterIndex, Object x). * *

Note: This method throws an exception if there is an ambiguity, for example, if the * object is of a class implementing more than one of the interfaces named above. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs; this method is called on a closed * PreparedStatement or the type of the given object is ambiguous */ @Override public void setObject(int parameterIndex, Object x) throws SQLException { setInternalObject(parameterIndex, x, null, null); } /** * Sets the designated parameter to the given Reader object, which is the given * number of characters long. When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a java.io.Reader * object. The data will be read from the stream as needed until end-of-file is reached. The JDBC * driver will do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param reader the java.io.Reader object that contains the Unicode data * @param length the number of characters in the stream * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @since 1.2 */ @Override public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { checkIndex(parameterIndex); parameters.set( parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, reader, (long) length)); } /** * Sets the designated parameter to the given REF(<structured-type>) value. The * driver converts this to an SQL REF value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x an SQL REF value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.2 */ @Override public void setRef(int parameterIndex, Ref x) throws SQLException { throw exceptionFactory().notSupported("REF parameter are not supported"); } /** * Sets the designated parameter to the given java.sql.Blob object. The driver * converts this to an SQL BLOB value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x a Blob object that maps an SQL BLOB value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.2 */ @Override public void setBlob(int parameterIndex, Blob x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(BlobCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given java.sql.Clob object. The driver * converts this to an SQL CLOB value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x a Clob object that maps an SQL CLOB value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.2 */ @Override public void setClob(int parameterIndex, Clob x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ClobCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given java.sql.Array object. The driver * converts this to an SQL ARRAY value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x an Array object that maps an SQL ARRAY value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.2 */ @Override public void setArray(int parameterIndex, Array x) throws SQLException { throw exceptionFactory().notSupported("Array parameter are not supported"); } /** * Sets the designated parameter to the given java.sql.Date value, using the given * Calendar object. The driver uses the Calendar object to construct an * SQL DATE value, which the driver then sends to the database. With a Calendar * object, the driver can calculate the date taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default timezone, which is that * of the virtual machine running the application. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the Calendar object the driver will use to construct the date * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @since 1.2 */ @Override public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new ParameterWithCal<>(DateCodec.INSTANCE, x, cal)); } /** * Sets the designated parameter to the given java.sql.Time value, using the given * Calendar object. The driver uses the Calendar object to construct an * SQL TIME value, which the driver then sends to the database. With a Calendar * object, the driver can calculate the time taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default timezone, which is that * of the virtual machine running the application. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the Calendar object the driver will use to construct the time * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @since 1.2 */ @Override public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new ParameterWithCal<>(TimeCodec.INSTANCE, x, cal)); } /** * Sets the designated parameter to the given java.sql.Timestamp value, using the * given Calendar object. The driver uses the Calendar object to * construct an SQL TIMESTAMP value, which the driver then sends to the database. * With a Calendar object, the driver can calculate the timestamp taking into account * a custom timezone. If no Calendar object is specified, the driver uses the default * timezone, which is that of the virtual machine running the application. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the Calendar object the driver will use to construct the timestamp * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @since 1.2 */ @Override public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new ParameterWithCal<>(TimestampCodec.INSTANCE, x, cal)); } /** * Sets the designated parameter to SQL NULL. This version of the method * setNull should be used for user-defined types and REF type parameters. Examples of * user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types. * *

Note: To be portable, applications must give the SQL type code and the * fully-qualified SQL type name when specifying a NULL user-defined or REF parameter. In the case * of a user-defined type the name is the type name of the parameter itself. For a REF parameter, * the name is the type name of the referenced type. If a JDBC driver does not need the type code * or type name information, it may ignore it. * *

Although it is intended for user-defined and Ref parameters, this method may be used to set * a null parameter of any JDBC type. If the parameter does not have a user-defined or REF type, * the given typeName is ignored. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param sqlType a value from java.sql.Types * @param typeName the fully-qualified name of an SQL user-defined type; ignored if the parameter * is not a user-defined type or REF * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if sqlType is a ARRAY, * BLOB, CLOB, DATALINK, JAVA_OBJECT, * NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML or STRUCT data type and * the JDBC driver does not support this data type or if the JDBC driver does not support this * method * @since 1.2 */ @Override public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, Parameter.NULL_PARAMETER); } /** * Sets the designated parameter to the given java.net.URL value. The driver converts * this to an SQL DATALINK value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java.net.URL object to be set * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.4 */ @Override public void setURL(int parameterIndex, URL x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StringCodec.INSTANCE, x.toString())); } /** * Sets the designated parameter to the given java.sql.RowId object. The driver * converts this to an SQL ROWID value when it sends it to the database * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setRowId(int parameterIndex, RowId x) throws SQLException { throw exceptionFactory().notSupported("RowId parameter are not supported"); } /** * Sets the designated parameter to the given String object. The driver converts this * to an SQL NCHAR or NVARCHAR or LONGNVARCHAR value * (depending on the argument's size relative to the driver's limits on NVARCHAR * values) when it sends it to the database. * * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if the driver does not support national character sets; if the driver can detect * that a data conversion error could occur; if a database access error occurs; or this method * is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setNString(int parameterIndex, String value) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StringCodec.INSTANCE, value)); } /** * Sets the designated parameter to a Reader object. The Reader reads * the data till end-of-file is reached. The driver does the necessary conversion from Java * character format to the national character set in the database. * * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @param length the number of characters in the parameter data. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if the driver does not support national character sets; if the driver can detect * that a data conversion error could occur; if a database access error occurs; or this method * is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, value, length)); } /** * Sets the designated parameter to a java.sql.NClob object. The driver converts this * to an SQL NCLOB value when it sends it to the database. * * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if the driver does not support national character sets; if the driver can detect * that a data conversion error could occur; if a database access error occurs; or this method * is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setNClob(int parameterIndex, NClob value) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ClobCodec.INSTANCE, value)); } /** * Sets the designated parameter to a Reader object. The reader must contain the * number of characters specified by length otherwise a SQLException will be * generated when the PreparedStatement is executed. This method differs from the * setCharacterStream (int, Reader, int) method because it informs the driver that * the parameter value should be sent to the server as a CLOB. When the * setCharacterStream method is used, the driver may have to do extra work to determine * whether the parameter data should be sent to the server as a LONGVARCHAR or a * CLOB * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs; this method is called on a closed * PreparedStatement or if the length specified is less than zero. * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, reader, length)); } /** * Sets the designated parameter to a InputStream object. The inputstream must * contain the number of characters specified by length otherwise a SQLException will * be generated when the PreparedStatement is executed. This method differs from the * setBinaryStream (int, InputStream, int) method because it informs the driver that * the parameter value should be sent to the server as a BLOB. When the * setBinaryStream method is used, the driver may have to do extra work to determine * whether the parameter data should be sent to the server as a LONGVARBINARY or a * BLOB * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param inputStream An object that contains the data to set the parameter value to. * @param length the number of bytes in the parameter data. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs; this method is called on a closed * PreparedStatement; if the length specified is less than zero or if the number of * bytes in the inputstream does not match the specified length. * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, inputStream, length)); } /** * Sets the designated parameter to a Reader object. The reader must contain the * number of characters specified by length otherwise a SQLException will be * generated when the PreparedStatement is executed. This method differs from the * setCharacterStream (int, Reader, int) method because it informs the driver that * the parameter value should be sent to the server as a NCLOB. When the * setCharacterStream method is used, the driver may have to do extra work to determine * whether the parameter data should be sent to the server as a LONGNVARCHAR or a * NCLOB * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if the length specified is less than zero; if the driver does not support * national character sets; if the driver can detect that a data conversion error could occur; * if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, reader, length)); } /** * Sets the designated parameter to the given java.sql.SQLXML object. The driver * converts this to an SQL XML value when it sends it to the database. * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param xmlObject a SQLXML object that maps an SQL XML value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs; this method is called on a closed * PreparedStatement or the java.xml.transform.Result, Writer * or OutputStream has not been closed for the SQLXML object * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { throw exceptionFactory().notSupported("SQLXML parameter are not supported"); } private ExceptionFactory exceptionFactory() { return con.getExceptionFactory().of(this); } /** * Sets the value of the designated parameter with the given object. * *

If the second argument is an InputStream then the stream must contain the * number of bytes specified by scaleOrLength. If the second argument is a Reader * then the reader must contain the number of characters specified by scaleOrLength. If these * conditions are not true the driver will generate a SQLException when the prepared * statement is executed. * *

The given Java object will be converted to the given targetSqlType before being sent to the * database. * *

If the object has a custom mapping (is of a class implementing the interface SQLData * ), the JDBC driver should call the method SQLData.writeSQL to write it to * the SQL data stream. If, on the other hand, the object is of a class implementing Ref * , Blob, Clob, NClob, Struct, * java.net.URL, or Array, the driver should pass it to the database as a * value of the corresponding SQL type. * *

Note that this method may be used to pass database-specific abstract data types. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @param targetSqlType the SQL type (as defined in java.sql.Types) to be sent to the database. * The scale argument may further qualify this type. * @param scaleOrLength for java.sql.Types.DECIMAL or * java.sql.Types.NUMERIC types, this is the number of digits after the decimal point. * For Java Object types InputStream and Reader, this is the length * of the data in the stream or reader. For all other types, this value will be ignored. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs; this method is called on a closed * PreparedStatement or if the Java Object specified by x is an InputStream or Reader * object and the value of the scale parameter is less than zero * @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified * targetSqlType * @see Types */ @Override public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { setInternalObject(parameterIndex, x, targetSqlType, (long) scaleOrLength); } @SuppressWarnings({"unchecked", "rawtypes"}) private void setInternalObject( int parameterIndex, Object obj, Integer targetSqlType, Long scaleOrLength) throws SQLException { checkIndex(parameterIndex); if (obj == null) { parameters.set(parameterIndex - 1, Parameter.NULL_PARAMETER); return; } if (targetSqlType != null) { // target type is defined. // in case of not corresponding data type, converting switch (targetSqlType) { case Types.ARRAY: case Types.DATALINK: case Types.JAVA_OBJECT: case Types.REF: case Types.ROWID: case Types.SQLXML: case Types.STRUCT: throw exceptionFactory().notSupported("Type not supported"); default: break; } if (obj instanceof String || obj instanceof Character) { if (targetSqlType == Types.BLOB) { throw exceptionFactory() .create( String.format( "Cannot convert a %s to a Blob", obj instanceof String ? "string" : "character")); } String str = obj instanceof String ? (String) obj : ((Character) obj).toString(); try { switch (targetSqlType) { case Types.BIT: case Types.BOOLEAN: setBoolean(parameterIndex, !("false".equalsIgnoreCase(str) || "0".equals(str))); return; case Types.TINYINT: setByte(parameterIndex, Byte.parseByte(str)); return; case Types.SMALLINT: setShort(parameterIndex, Short.parseShort(str)); return; case Types.INTEGER: setInt(parameterIndex, Integer.parseInt(str)); return; case Types.DOUBLE: case Types.FLOAT: setDouble(parameterIndex, Double.valueOf(str)); return; case Types.REAL: setFloat(parameterIndex, Float.valueOf(str)); return; case Types.BIGINT: setLong(parameterIndex, Long.valueOf(str)); return; case Types.DECIMAL: case Types.NUMERIC: setBigDecimal(parameterIndex, new BigDecimal(str)); return; case Types.CLOB: case Types.NCLOB: case Types.CHAR: case Types.VARCHAR: case Types.LONGVARCHAR: case Types.NCHAR: case Types.NVARCHAR: case Types.LONGNVARCHAR: setString(parameterIndex, str); return; case Types.TIMESTAMP: if (str.startsWith("0000-00-00")) { setTimestamp(parameterIndex, null); } else { setTimestamp(parameterIndex, Timestamp.valueOf(str)); } return; case Types.TIME: setTime(parameterIndex, Time.valueOf((String) obj)); return; default: throw exceptionFactory() .create(String.format("Could not convert [%s] to %s", str, targetSqlType)); } } catch (IllegalArgumentException e) { throw exceptionFactory() .create( String.format("Could not convert [%s] to java.sql.Type %s", str, targetSqlType), "HY000", e); } } else if (obj instanceof Number) { Number bd = (Number) obj; switch (targetSqlType) { case Types.TINYINT: setByte(parameterIndex, bd.byteValue()); return; case Types.SMALLINT: setShort(parameterIndex, bd.shortValue()); return; case Types.INTEGER: setInt(parameterIndex, bd.intValue()); return; case Types.BIGINT: setLong(parameterIndex, bd.longValue()); return; case Types.FLOAT: case Types.DOUBLE: setDouble(parameterIndex, bd.doubleValue()); return; case Types.REAL: setFloat(parameterIndex, bd.floatValue()); return; case Types.DECIMAL: case Types.NUMERIC: if (obj instanceof BigDecimal) { setBigDecimal(parameterIndex, (BigDecimal) obj); } else if (obj instanceof Double || obj instanceof Float) { setDouble(parameterIndex, bd.doubleValue()); } else { setLong(parameterIndex, bd.longValue()); } return; case Types.BIT: setBoolean(parameterIndex, bd.shortValue() != 0); return; case Types.CHAR: case Types.VARCHAR: setString(parameterIndex, bd.toString()); return; default: throw exceptionFactory() .create(String.format("Could not convert [%s] to %s", bd, targetSqlType)); } } else if (obj instanceof byte[]) { if (targetSqlType == Types.BINARY || targetSqlType == Types.VARBINARY || targetSqlType == Types.LONGVARBINARY) { setBytes(parameterIndex, (byte[]) obj); return; } else if (targetSqlType == Types.BLOB) { setBlob(parameterIndex, new MariaDbBlob((byte[]) obj)); } else { throw exceptionFactory() .create("Can only convert a byte[] to BINARY, VARBINARY, LONGVARBINARY or BLOB type"); } } } // in case parameter still not set, defaulting to object type for (Codec codec : con.getContext().getConf().codecs()) { if (codec.canEncode(obj)) { Parameter p = new Parameter(codec, obj, scaleOrLength); parameters.set(parameterIndex - 1, p); return; } } throw new SQLException(String.format("Type %s not supported type", obj.getClass().getName())); } /** * Sets the designated parameter to the given input stream, which will have the specified number * of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it * may be more practical to send it via a java.io.InputStream. Data will be read from * the stream as needed until end-of-file is reached. The JDBC driver will do any necessary * conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the Java input stream that contains the ASCII parameter value * @param length the number of bytes in the stream * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @since 1.6 */ @Override public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, x, length)); } /** * Sets the designated parameter to the given input stream, which will have the specified number * of bytes. When a very large binary value is input to a LONGVARBINARY parameter, it * may be more practical to send it via a java.io.InputStream object. The data will * be read from the stream as needed until end-of-file is reached. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java input stream which contains the binary parameter value * @param length the number of bytes in the stream * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @since 1.6 */ @Override public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, x, length)); } /** * Sets the designated parameter to the given Reader object, which is the given * number of characters long. When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a java.io.Reader * object. The data will be read from the stream as needed until end-of-file is reached. The JDBC * driver will do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param reader the java.io.Reader object that contains the Unicode data * @param length the number of characters in the stream * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @since 1.6 */ @Override public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, reader, length)); } /** * Sets the designated parameter to the given input stream. When a very large ASCII value is input * to a LONGVARCHAR parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream as needed until end-of-file is * reached. The JDBC driver will do any necessary conversion from ASCII to the database char * format. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * *

Note: Consult your JDBC driver documentation to determine if it might be more * efficient to use a version of setAsciiStream which takes a length parameter. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the Java input stream that contains the ASCII parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given input stream. When a very large binary value is * input to a LONGVARBINARY parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the stream as needed until * end-of-file is reached. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * *

Note: Consult your JDBC driver documentation to determine if it might be more * efficient to use a version of setBinaryStream which takes a length parameter. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java input stream which contains the binary parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, x)); } /** * Sets the designated parameter to the given Reader object. When a very large * UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to * send it via a java.io.Reader object. The data will be read from the stream as * needed until end-of-file is reached. The JDBC driver will do any necessary conversion from * UNICODE to the database char format. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * *

Note: Consult your JDBC driver documentation to determine if it might be more * efficient to use a version of setCharacterStream which takes a length parameter. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param reader the java.io.Reader object that contains the Unicode data * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed * PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, reader)); } /** * Sets the designated parameter to a Reader object. The Reader reads * the data till end-of-file is reached. The driver does the necessary conversion from Java * character format to the national character set in the database. * *

Note: This stream object can either be a standard Java stream object or your own * subclass that implements the standard interface. * *

Note: Consult your JDBC driver documentation to determine if it might be more * efficient to use a version of setNCharacterStream which takes a length parameter. * * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if the driver does not support national character sets; if the driver can detect * that a data conversion error could occur; if a database access error occurs; or this method * is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, value)); } /** * Sets the designated parameter to a Reader object. This method differs from the * setCharacterStream (int, Reader) method because it informs the driver that the * parameter value should be sent to the server as a CLOB. When the * setCharacterStream method is used, the driver may have to do extra work to determine * whether the parameter data should be sent to the server as a LONGVARCHAR or a * CLOB * *

Note: Consult your JDBC driver documentation to determine if it might be more * efficient to use a version of setClob which takes a length parameter. * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs; this method is called on a closed * PreparedStatementor if parameterIndex does not correspond to a parameter marker in * the SQL statement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setClob(int parameterIndex, Reader reader) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, reader)); } /** * Sets the designated parameter to a InputStream object. This method differs from * the setBinaryStream (int, InputStream) method because it informs the driver that * the parameter value should be sent to the server as a BLOB. When the * setBinaryStream method is used, the driver may have to do extra work to determine * whether the parameter data should be sent to the server as a LONGVARBINARY or a * BLOB * *

Note: Consult your JDBC driver documentation to determine if it might be more * efficient to use a version of setBlob which takes a length parameter. * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param inputStream An object that contains the data to set the parameter value to. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs; this method is called on a closed * PreparedStatement or if parameterIndex does not correspond to a parameter marker in * the SQL statement, * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(StreamCodec.INSTANCE, inputStream)); } /** * Sets the designated parameter to a Reader object. This method differs from the * setCharacterStream (int, Reader) method because it informs the driver that the * parameter value should be sent to the server as a NCLOB. When the * setCharacterStream method is used, the driver may have to do extra work to determine * whether the parameter data should be sent to the server as a LONGNVARCHAR or a * NCLOB * *

Note: Consult your JDBC driver documentation to determine if it might be more * efficient to use a version of setNClob which takes a length parameter. * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if the driver does not support national character sets; if the driver can detect * that a data conversion error could occur; if a database access error occurs or this method * is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ @Override public void setNClob(int parameterIndex, Reader reader) throws SQLException { checkIndex(parameterIndex); parameters.set(parameterIndex - 1, new Parameter<>(ReaderCodec.INSTANCE, reader)); } /** * Sets the value of the designated parameter with the given object. * *

If the second argument is an {@code InputStream} then the stream must contain the number of * bytes specified by scaleOrLength. If the second argument is a {@code Reader} then the reader * must contain the number of characters specified by scaleOrLength. If these conditions are not * true the driver will generate a {@code SQLException} when the prepared statement is executed. * *

The given Java object will be converted to the given targetSqlType before being sent to the * database. * *

If the object has a custom mapping (is of a class implementing the interface {@code * SQLData}), the JDBC driver should call the method {@code SQLData.writeSQL} to write it to the * SQL data stream. If, on the other hand, the object is of a class implementing {@code Ref}, * {@code Blob}, {@code Clob}, {@code NClob}, {@code Struct}, {@code java.net.URL}, or {@code * Array}, the driver should pass it to the database as a value of the corresponding SQL type. * *

Note that this method may be used to pass database-specific abstract data types. * *

The default implementation will throw {@code SQLFeatureNotSupportedException} * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @param targetSqlType the SQL type to be sent to the database. The scale argument may further * qualify this type. * @param scaleOrLength for {@code java.sql.JDBCType.DECIMAL} or {@code java.sql.JDBCType.NUMERIC * types}, this is the number of digits after the decimal point. For Java Object types {@code * InputStream} and {@code Reader}, this is the length of the data in the stream or reader. * For all other types, this value will be ignored. * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed {@code * PreparedStatement} or if the Java Object specified by x is an InputStream or Reader object * and the value of the scale parameter is less than zero * @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified * targetSqlType * @see JDBCType * @see SQLType * @since 1.8 */ @Override public void setObject(int parameterIndex, Object x, SQLType targetSqlType, int scaleOrLength) throws SQLException { setInternalObject( parameterIndex, x, targetSqlType == null ? null : targetSqlType.getVendorTypeNumber(), (long) scaleOrLength); } /** * Sets the value of the designated parameter with the given object. * *

This method is similar to {@link #setObject(int parameterIndex, Object x, SQLType * targetSqlType, int scaleOrLength)}, except that it assumes a scale of zero. * *

The default implementation will throw {@code SQLFeatureNotSupportedException} * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @param targetSqlType the SQL type to be sent to the database * @throws SQLException if parameterIndex does not correspond to a parameter marker in the SQL * statement; if a database access error occurs or this method is called on a closed {@code * PreparedStatement} * @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified * targetSqlType * @see JDBCType * @see SQLType * @since 1.8 */ @Override public void setObject(int parameterIndex, Object x, SQLType targetSqlType) throws SQLException { setInternalObject( parameterIndex, x, targetSqlType == null ? null : targetSqlType.getVendorTypeNumber(), null); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy