public void setObject()

in src/main/core-impl/java/com/mysql/cj/AbstractQueryBindings.java [322:1029]


    public void setObject(int parameterIndex, Object parameterObj, MysqlType targetMysqlType, int scaleOrLength) {
        if (parameterObj == null) {
            setNull(parameterIndex);
            return;
        }
        /*
         * According to Table-B5 in the JDBC Spec
         */
        try {
            if (parameterObj instanceof LocalDate) {
                switch (targetMysqlType) {
                    case DATE:
                        setLocalDate(parameterIndex, (LocalDate) parameterObj, targetMysqlType);
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        setLocalDateTime(parameterIndex, LocalDateTime.of((LocalDate) parameterObj, DEFAULT_TIME), targetMysqlType);
                        break;
                    case YEAR:
                        setInt(parameterIndex, ((LocalDate) parameterObj).getYear());
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex, parameterObj.toString());
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof LocalTime) {
                switch (targetMysqlType) {
                    case TIME:
                        setLocalTime(parameterIndex, (LocalTime) parameterObj, targetMysqlType);
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex,
                                ((LocalTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((LocalTime) parameterObj).getNano() > 0
                                        ? TimeUtil.TIME_FORMATTER_WITH_NANOS_NO_OFFSET
                                        : TimeUtil.TIME_FORMATTER_NO_FRACT_NO_OFFSET));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof LocalDateTime) {
                switch (targetMysqlType) {
                    case DATE:
                    case DATETIME:
                    case TIMESTAMP:
                    case TIME:
                        setLocalDateTime(parameterIndex, ((LocalDateTime) parameterObj), targetMysqlType);
                        break;
                    case YEAR:
                        setInt(parameterIndex, ((LocalDateTime) parameterObj).getYear());
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex,
                                ((LocalDateTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((LocalDateTime) parameterObj).getNano() > 0
                                        ? TimeUtil.DATETIME_FORMATTER_WITH_NANOS_NO_OFFSET
                                        : TimeUtil.DATETIME_FORMATTER_NO_FRACT_NO_OFFSET));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof OffsetTime) {
                switch (targetMysqlType) {
                    case TIME:
                        setLocalTime(parameterIndex,
                                ((OffsetTime) parameterObj)
                                        .withOffsetSameInstant(
                                                ZoneOffset.ofTotalSeconds(this.session.getServerSession().getDefaultTimeZone().getRawOffset() / 1000))
                                        .toLocalTime(),
                                targetMysqlType);
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex,
                                ((OffsetTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((OffsetTime) parameterObj).getNano() > 0
                                        ? TimeUtil.TIME_FORMATTER_WITH_NANOS_WITH_OFFSET
                                        : TimeUtil.TIME_FORMATTER_NO_FRACT_WITH_OFFSET));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof OffsetDateTime) {
                switch (targetMysqlType) {
                    case DATE:
                        setLocalDate(parameterIndex, ((OffsetDateTime) parameterObj)
                                .atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDate(), targetMysqlType);
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        java.sql.Timestamp ts = Timestamp.valueOf(((OffsetDateTime) parameterObj)
                                .atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDateTime());

                        int fractLen = -1;
                        if (!this.session.getServerSession().getCapabilities().serverSupportsFracSecs() || !this.sendFractionalSeconds.getValue()) {
                            fractLen = 0;
                        } else if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0
                                && this.columnDefinition.getFields()[parameterIndex].getDecimals() > 0) {
                            fractLen = this.columnDefinition.getFields()[parameterIndex].getDecimals();
                        }

                        if (fractLen == 0) {
                            ts = TimeUtil.truncateFractionalSeconds(ts);
                        }

                        bindTimestamp(parameterIndex, ts, null, fractLen, targetMysqlType);
                        break;
                    case TIME:
                        setLocalTime(parameterIndex, ((OffsetDateTime) parameterObj)
                                .atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalTime(), targetMysqlType);
                        break;
                    case YEAR:
                        setInt(parameterIndex,
                                ((OffsetDateTime) parameterObj).atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).getYear());
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex,
                                ((OffsetDateTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((OffsetDateTime) parameterObj).getNano() > 0
                                        ? TimeUtil.DATETIME_FORMATTER_WITH_NANOS_WITH_OFFSET
                                        : TimeUtil.DATETIME_FORMATTER_NO_FRACT_WITH_OFFSET));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof ZonedDateTime) {
                switch (targetMysqlType) {
                    case DATE:
                        setLocalDate(parameterIndex, ((ZonedDateTime) parameterObj)
                                .withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDate(), targetMysqlType);
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        java.sql.Timestamp ts = Timestamp.valueOf(((ZonedDateTime) parameterObj)
                                .withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDateTime());

                        int fractLen = -1;
                        if (!this.session.getServerSession().getCapabilities().serverSupportsFracSecs() || !this.sendFractionalSeconds.getValue()) {
                            fractLen = 0;
                        } else if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0
                                && this.columnDefinition.getFields()[parameterIndex].getDecimals() > 0) {
                            fractLen = this.columnDefinition.getFields()[parameterIndex].getDecimals();
                        }

                        if (fractLen == 0) {
                            ts = TimeUtil.truncateFractionalSeconds(ts);
                        }

                        bindTimestamp(parameterIndex, ts, null, fractLen, targetMysqlType);
                        break;
                    case TIME:
                        setLocalTime(parameterIndex, ((ZonedDateTime) parameterObj)
                                .withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalTime(), targetMysqlType);
                        break;
                    case YEAR:
                        setInt(parameterIndex,
                                ((ZonedDateTime) parameterObj).withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).getYear());
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex,
                                ((ZonedDateTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((ZonedDateTime) parameterObj).getNano() > 0
                                        ? TimeUtil.DATETIME_FORMATTER_WITH_NANOS_WITH_OFFSET
                                        : TimeUtil.DATETIME_FORMATTER_NO_FRACT_WITH_OFFSET));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof java.sql.Date) {
                switch (targetMysqlType) {
                    case DATE:
                        setDate(parameterIndex, (java.sql.Date) parameterObj);
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        setTimestamp(parameterIndex, new java.sql.Timestamp(((java.util.Date) parameterObj).getTime()), targetMysqlType);
                        break;
                    case YEAR:
                        Calendar cal = Calendar.getInstance();
                        cal.setTime((java.util.Date) parameterObj);
                        setInt(parameterIndex, cal.get(Calendar.YEAR));
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex, parameterObj.toString());
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof java.sql.Timestamp) {
                switch (targetMysqlType) {
                    case DATE:
                        setDate(parameterIndex, new java.sql.Date(((java.util.Date) parameterObj).getTime()));
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        setTimestamp(parameterIndex, (java.sql.Timestamp) parameterObj, targetMysqlType);
                        break;
                    case YEAR:
                        Calendar cal = Calendar.getInstance();
                        cal.setTime((java.util.Date) parameterObj);
                        setInt(parameterIndex, cal.get(Calendar.YEAR));
                        break;
                    case TIME:
                        setLocalTime(parameterIndex, ((java.sql.Timestamp) parameterObj).toLocalDateTime().toLocalTime(), targetMysqlType);
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        String val = parameterObj.toString();
                        int dotPos;
                        if ((((java.sql.Timestamp) parameterObj).getNanos() == 0 || !this.sendFractionalSeconds.getValue())
                                && (dotPos = val.indexOf(".")) > 0) {
                            val = val.substring(0, dotPos);
                        }
                        setString(parameterIndex, val);
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof java.sql.Time) {
                switch (targetMysqlType) {
                    case DATE:
                        setDate(parameterIndex, new java.sql.Date(((java.util.Date) parameterObj).getTime()));
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        java.sql.Timestamp ts = new java.sql.Timestamp(((java.sql.Time) parameterObj).getTime());

                        int fractLen = -1;
                        if (!this.session.getServerSession().getCapabilities().serverSupportsFracSecs() || !this.sendFractionalSecondsForTime.getValue()
                                || !this.sendFractionalSeconds.getValue()) {
                            fractLen = 0;
                        } else if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0
                                && this.columnDefinition.getFields()[parameterIndex].getDecimals() > 0) {
                            fractLen = this.columnDefinition.getFields()[parameterIndex].getDecimals();
                        }

                        if (fractLen == 0) {
                            ts = TimeUtil.truncateFractionalSeconds(ts);
                        }

                        bindTimestamp(parameterIndex, ts, null, fractLen, MysqlType.DATETIME); // Override TIMESTAMP to avoid conversion to the server time zone

                        break;
                    case YEAR:
                        Calendar cal = Calendar.getInstance();
                        cal.setTime((java.util.Date) parameterObj);
                        setInt(parameterIndex, cal.get(Calendar.YEAR));
                        break;
                    case TIME:
                        setTime(parameterIndex, (java.sql.Time) parameterObj);
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(
                                parameterIndex, TimeUtil
                                        .getSimpleDateFormat(this.session.getServerSession().getCapabilities().serverSupportsFracSecs()
                                                && this.sendFractionalSeconds.getValue() && this.sendFractionalSecondsForTime.getValue()
                                                && TimeUtil.hasFractionalSeconds((java.sql.Time) parameterObj) ? "HH:mm:ss.SSS" : "HH:mm:ss", null)
                                        .format(parameterObj));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof java.util.Date) {
                if (!this.treatUtilDateAsTimestamp.getValue()) { // TODO is it needed at all?
                    setSerializableObject(parameterIndex, parameterObj);
                    return;
                }
                switch (targetMysqlType) {
                    case DATE:
                        setDate(parameterIndex, new java.sql.Date(((java.util.Date) parameterObj).getTime()));
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        setTimestamp(parameterIndex, new java.sql.Timestamp(((java.util.Date) parameterObj).getTime()), targetMysqlType);
                        break;
                    case YEAR:
                        Calendar cal = Calendar.getInstance();
                        cal.setTime(((java.util.Date) parameterObj));
                        setInt(parameterIndex, cal.get(Calendar.YEAR));
                        break;
                    case TIME:
                        LocalTime lt = ((java.util.Date) parameterObj).toInstant().atZone(this.session.getServerSession().getDefaultTimeZone().toZoneId())
                                .toLocalTime();
                        setLocalTime(parameterIndex, lt, targetMysqlType);
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex, TimeUtil.getSimpleDateFormat(
                                this.session.getServerSession().getCapabilities().serverSupportsFracSecs() && this.sendFractionalSeconds.getValue()
                                        && ((java.util.Date) parameterObj).toInstant().getNano() > 0 ? "yyyy-MM-dd HH:mm:ss.SSS" : "yyyy-MM-dd HH:mm:ss",
                                null).format(parameterObj));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof java.util.Calendar) {
                switch (targetMysqlType) {
                    case DATE:
                        setDate(parameterIndex, new java.sql.Date(((java.util.Calendar) parameterObj).getTimeInMillis()));
                        break;
                    case DATETIME:
                    case TIMESTAMP:
                        setTimestamp(parameterIndex, new java.sql.Timestamp(((java.util.Calendar) parameterObj).getTimeInMillis()), targetMysqlType);
                        break;
                    case YEAR:
                        setInt(parameterIndex, ((java.util.Calendar) parameterObj).get(Calendar.YEAR));
                        break;
                    case TIME:
                        LocalTime lt = ((java.util.Calendar) parameterObj).toInstant().atZone(this.session.getServerSession().getDefaultTimeZone().toZoneId())
                                .toLocalTime();
                        setLocalTime(parameterIndex, lt, targetMysqlType);
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        ZonedDateTime zdt = ZonedDateTime
                                .ofInstant(((java.util.Calendar) parameterObj).toInstant(), ((java.util.Calendar) parameterObj).getTimeZone().toZoneId())
                                .withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId());
                        setString(parameterIndex,
                                zdt.format(zdt.getNano() > 0 && this.session.getServerSession().getCapabilities().serverSupportsFracSecs()
                                        && this.sendFractionalSeconds.getValue() ? TimeUtil.DATETIME_FORMATTER_WITH_MILLIS_NO_OFFSET
                                                : TimeUtil.DATETIME_FORMATTER_NO_FRACT_NO_OFFSET));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof String) {
                switch (targetMysqlType) {
                    case BOOLEAN:
                        if ("true".equalsIgnoreCase((String) parameterObj) || "Y".equalsIgnoreCase((String) parameterObj)) {
                            setBoolean(parameterIndex, true);
                        } else if ("false".equalsIgnoreCase((String) parameterObj) || "N".equalsIgnoreCase((String) parameterObj)) {
                            setBoolean(parameterIndex, false);
                        } else if (((String) parameterObj).matches("-?\\d+\\.?\\d*")) {
                            setBoolean(parameterIndex, !((String) parameterObj).matches("-?[0]+[.]*[0]*"));
                        } else {
                            throw ExceptionFactory.createException(WrongArgumentException.class,
                                    Messages.getString("PreparedStatement.66", new Object[] { parameterObj }), this.session.getExceptionInterceptor());
                        }
                        break;
                    case BIT:
                        if ("1".equals(parameterObj) || "0".equals(parameterObj)) {
                            setInt(parameterIndex, Integer.valueOf((String) parameterObj).intValue());
                        } else {
                            boolean parameterAsBoolean = "true".equalsIgnoreCase((String) parameterObj);
                            setInt(parameterIndex, parameterAsBoolean ? 1 : 0);
                        }
                        break;

                    case TINYINT:
                    case TINYINT_UNSIGNED:
                    case SMALLINT:
                    case SMALLINT_UNSIGNED:
                    case MEDIUMINT:
                    case MEDIUMINT_UNSIGNED:
                    case INT:
                    case INT_UNSIGNED:
                        //case YEAR:
                        setInt(parameterIndex, Integer.valueOf((String) parameterObj).intValue());
                        break;
                    case BIGINT:
                        setLong(parameterIndex, Long.valueOf((String) parameterObj).longValue());
                        break;
                    case BIGINT_UNSIGNED:
                        setLong(parameterIndex, new BigInteger((String) parameterObj).longValue());
                        break;
                    case FLOAT:
                    case FLOAT_UNSIGNED:
                        setFloat(parameterIndex, Float.valueOf((String) parameterObj).floatValue());
                        break;
                    case DOUBLE:
                    case DOUBLE_UNSIGNED:
                        setDouble(parameterIndex, Double.valueOf((String) parameterObj).doubleValue());
                        break;
                    case DECIMAL:
                    case DECIMAL_UNSIGNED:
                        BigDecimal parameterAsNum = new BigDecimal((String) parameterObj);
                        BigDecimal scaledBigDecimal = null;

                        try {
                            scaledBigDecimal = parameterAsNum.setScale(scaleOrLength);
                        } catch (ArithmeticException ex) {
                            try {
                                scaledBigDecimal = parameterAsNum.setScale(scaleOrLength, BigDecimal.ROUND_HALF_UP);
                            } catch (ArithmeticException arEx) {
                                throw ExceptionFactory.createException(WrongArgumentException.class,
                                        Messages.getString("PreparedStatement.65", new Object[] { scaleOrLength, parameterAsNum }),
                                        this.session.getExceptionInterceptor());
                            }
                        }
                        setBigDecimal(parameterIndex, scaledBigDecimal);
                        break;

                    case CHAR:
                    case ENUM:
                    case SET:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                    case JSON:
                        setString(parameterIndex, parameterObj.toString());
                        break;
                    case BINARY:
                    case GEOMETRY:
                    case VARBINARY:
                    case TINYBLOB:
                    case BLOB:
                    case MEDIUMBLOB:
                    case LONGBLOB:
                        setBytes(parameterIndex, StringUtils.getBytes(parameterObj.toString(), this.charEncoding));
                        break;
                    case DATE:
                    case DATETIME:
                    case TIMESTAMP:
                    case YEAR:
                        ParsePosition pp = new ParsePosition(0);
                        java.text.DateFormat sdf = new java.text.SimpleDateFormat(TimeUtil.getDateTimePattern((String) parameterObj, false), Locale.US);
                        setObject(parameterIndex, sdf.parse((String) parameterObj, pp), targetMysqlType, scaleOrLength);
                        break;
                    case TIME:
                        sdf = new java.text.SimpleDateFormat(TimeUtil.getDateTimePattern((String) parameterObj, true), Locale.US);
                        setTime(parameterIndex, new java.sql.Time(sdf.parse((String) parameterObj).getTime()));
                        break;
                    case UNKNOWN:
                        setSerializableObject(parameterIndex, parameterObj);
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof InputStream) {
                setBinaryStream(parameterIndex, (InputStream) parameterObj, -1);

            } else if (parameterObj instanceof Boolean) {
                switch (targetMysqlType) {
                    case BOOLEAN:
                        setBoolean(parameterIndex, ((Boolean) parameterObj).booleanValue());
                        break;
                    case BIT:
                    case TINYINT:
                    case TINYINT_UNSIGNED:
                    case SMALLINT:
                    case SMALLINT_UNSIGNED:
                    case MEDIUMINT:
                    case MEDIUMINT_UNSIGNED:
                    case INT:
                    case INT_UNSIGNED:
                    case YEAR:
                        setInt(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1 : 0);
                        break;
                    case BIGINT:
                    case BIGINT_UNSIGNED:
                        setLong(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1L : 0L);
                        break;
                    case FLOAT:
                    case FLOAT_UNSIGNED:
                        setFloat(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1f : 0f);
                        break;
                    case DOUBLE:
                    case DOUBLE_UNSIGNED:
                        setDouble(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1d : 0d);
                        break;
                    case DECIMAL:
                    case DECIMAL_UNSIGNED:
                        setBigDecimal(parameterIndex, new java.math.BigDecimal(((Boolean) parameterObj).booleanValue() ? 1d : 0d));
                        break;
                    case CHAR:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                        setString(parameterIndex, parameterObj.toString());
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else if (parameterObj instanceof Number) {
                Number parameterAsNum = (Number) parameterObj;
                switch (targetMysqlType) {
                    case BOOLEAN:
                        setBoolean(parameterIndex, parameterAsNum.intValue() != 0);
                        break;
                    case BIT:
                    case TINYINT:
                    case TINYINT_UNSIGNED:
                    case SMALLINT:
                    case SMALLINT_UNSIGNED:
                    case MEDIUMINT:
                    case MEDIUMINT_UNSIGNED:
                    case INT:
                    case INT_UNSIGNED:
                    case YEAR:
                        setInt(parameterIndex, parameterAsNum.intValue());
                        break;
                    case BIGINT:
                    case BIGINT_UNSIGNED:
                        setLong(parameterIndex, parameterAsNum.longValue());
                        break;
                    case FLOAT:
                    case FLOAT_UNSIGNED:
                        setFloat(parameterIndex, parameterAsNum.floatValue());
                        break;
                    case DOUBLE:
                    case DOUBLE_UNSIGNED:
                        setDouble(parameterIndex, parameterAsNum.doubleValue());
                        break;
                    case DECIMAL:
                    case DECIMAL_UNSIGNED:
                        if (parameterAsNum instanceof BigDecimal) {
                            BigDecimal scaledBigDecimal = null;

                            try {
                                scaledBigDecimal = ((BigDecimal) parameterAsNum).setScale(scaleOrLength);
                            } catch (ArithmeticException ex) {
                                try {
                                    scaledBigDecimal = ((BigDecimal) parameterAsNum).setScale(scaleOrLength, BigDecimal.ROUND_HALF_UP);
                                } catch (ArithmeticException arEx) {
                                    throw ExceptionFactory.createException(WrongArgumentException.class,
                                            Messages.getString("PreparedStatement.65", new Object[] { scaleOrLength, parameterAsNum }),
                                            this.session.getExceptionInterceptor());
                                }
                            }

                            setBigDecimal(parameterIndex, scaledBigDecimal);
                        } else if (parameterAsNum instanceof java.math.BigInteger) {
                            setBigDecimal(parameterIndex, new BigDecimal((java.math.BigInteger) parameterAsNum, scaleOrLength));
                        } else {
                            setBigDecimal(parameterIndex, new BigDecimal(parameterAsNum.doubleValue()));
                        }

                        break;
                    case CHAR:
                    case ENUM:
                    case SET:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                    case JSON:
                        if (parameterObj instanceof BigDecimal) {
                            setString(parameterIndex, (StringUtils.fixDecimalExponent(((BigDecimal) parameterObj).toPlainString())));
                        } else {
                            setString(parameterIndex, parameterObj.toString());
                        }
                        break;

                    case BINARY:
                    case GEOMETRY:
                    case VARBINARY:
                    case TINYBLOB:
                    case BLOB:
                    case MEDIUMBLOB:
                    case LONGBLOB:
                        setBytes(parameterIndex, StringUtils.getBytes(parameterObj.toString(), this.charEncoding));
                        break;
                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }

            } else {

                switch (targetMysqlType) {
                    case BOOLEAN:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.66", new Object[] { parameterObj.getClass().getName() }),
                                this.session.getExceptionInterceptor());
                    case CHAR:
                    case ENUM:
                    case SET:
                    case VARCHAR:
                    case TINYTEXT:
                    case TEXT:
                    case MEDIUMTEXT:
                    case LONGTEXT:
                    case JSON:
                        if (parameterObj instanceof BigDecimal) {
                            setString(parameterIndex, (StringUtils.fixDecimalExponent(((BigDecimal) parameterObj).toPlainString())));
                        } else if (parameterObj instanceof java.sql.Clob) {
                            setClob(parameterIndex, (java.sql.Clob) parameterObj);
                        } else {
                            setString(parameterIndex, parameterObj.toString());
                        }
                        break;

                    case BINARY:
                    case GEOMETRY:
                    case VARBINARY:
                    case TINYBLOB:
                    case BLOB:
                    case MEDIUMBLOB:
                    case LONGBLOB:
                        if (parameterObj instanceof byte[]) {
                            setBytes(parameterIndex, (byte[]) parameterObj);
                        } else if (parameterObj instanceof java.sql.Blob) {
                            setBlob(parameterIndex, (java.sql.Blob) parameterObj);
                        } else {
                            setBytes(parameterIndex, StringUtils.getBytes(parameterObj.toString(), this.charEncoding));
                        }

                        break;
                    case UNKNOWN:
                        setSerializableObject(parameterIndex, parameterObj);
                        break;

                    default:
                        throw ExceptionFactory.createException(WrongArgumentException.class,
                                Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
                                this.session.getExceptionInterceptor());
                }
            }
        } catch (Exception ex) {
            throw ExceptionFactory.createException(
                    Messages.getString("PreparedStatement.17") + parameterObj.getClass().toString() + Messages.getString("PreparedStatement.18")
                            + ex.getClass().getName() + Messages.getString("PreparedStatement.19") + ex.getMessage(),
                    ex, this.session.getExceptionInterceptor());
        }
    }