java - Prepared Statement 'setObject' 方法可以用于任何数据类型吗?

标签 java mysql jdbc prepared-statement

PreparedStatement.setObject 方法是否可以用于任何数据类型(StringIntegerDoubleDateDateTimeByte Array 等)由 MySQL 支持,而不是使用单独的 .setInt, .setDouble 等方法?

谢谢!

最佳答案

是的。但这取决于 JDBC 驱动程序。 如果传递 Int Value,setObject 转换为 setInt() 方法

传递的对象由 JDBC 驱动程序的 PreparedStatement 实现类进行分析。

Mysql JDBC 连接器的代码片段

public void setObject(int parameterIndex, Object parameterObj) throws SQLException {
    synchronized (checkClosed().getConnectionMutex()) {
        if (parameterObj == null) {
            setNull(parameterIndex, java.sql.Types.OTHER);
        } else {
            if (parameterObj instanceof Byte) {
                setInt(parameterIndex, ((Byte) parameterObj).intValue());
            } else if (parameterObj instanceof String) {
                setString(parameterIndex, (String) parameterObj);
            } else if (parameterObj instanceof BigDecimal) {
                setBigDecimal(parameterIndex, (BigDecimal) parameterObj);
            } else if (parameterObj instanceof Short) {
                setShort(parameterIndex, ((Short) parameterObj).shortValue());
            } else if (parameterObj instanceof Integer) {
                setInt(parameterIndex, ((Integer) parameterObj).intValue());
            } else if (parameterObj instanceof Long) {
                setLong(parameterIndex, ((Long) parameterObj).longValue());
            } else if (parameterObj instanceof Float) {
                setFloat(parameterIndex, ((Float) parameterObj).floatValue());
            } else if (parameterObj instanceof Double) {
                setDouble(parameterIndex, ((Double) parameterObj).doubleValue());
            } else if (parameterObj instanceof byte[]) {
                setBytes(parameterIndex, (byte[]) parameterObj);
            } else if (parameterObj instanceof java.sql.Date) {
                setDate(parameterIndex, (java.sql.Date) parameterObj);
            } else if (parameterObj instanceof Time) {
                setTime(parameterIndex, (Time) parameterObj);
            } else if (parameterObj instanceof Timestamp) {
                setTimestamp(parameterIndex, (Timestamp) parameterObj);
            } else if (parameterObj instanceof Boolean) {
                setBoolean(parameterIndex, ((Boolean) parameterObj).booleanValue());
            } else if (parameterObj instanceof InputStream) {
                setBinaryStream(parameterIndex, (InputStream) parameterObj, -1);
            } else if (parameterObj instanceof java.sql.Blob) {
                setBlob(parameterIndex, (java.sql.Blob) parameterObj);
            } else if (parameterObj instanceof java.sql.Clob) {
                setClob(parameterIndex, (java.sql.Clob) parameterObj);
            } else if (this.connection.getTreatUtilDateAsTimestamp() && parameterObj instanceof java.util.Date) {
                setTimestamp(parameterIndex, new Timestamp(((java.util.Date) parameterObj).getTime()));
            } else if (parameterObj instanceof BigInteger) {
                setString(parameterIndex, parameterObj.toString());
            } else {
                setSerializableObject(parameterIndex, parameterObj);
            }
        }
    }
}

如果你想了解更多细节,请参阅“com.mysql.jdbc”包中的“PreparedStatement”类。

关于java - Prepared Statement 'setObject' 方法可以用于任何数据类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531621/

相关文章:

postgresql - Play Framework PostgreSQL db.default.username 默认为 linux 用户名

sql - 数据库不可知的 jdbc 表导入/导出到文件?

java - 使用 ConcurrentSkipListMap 的并发测试队列

Java奇怪的变量赋值查询

java - 如何使实体只读?

mysql - 基于由 union 子句创建的联接更新表列

java - 由于作用域,对象未初始化

MySQL:如何实现行级安全(如 Oracle 的虚拟专用数据库)?

mysql - 使用条件计算mySQL中的时间差

java - JAR 与 JDBC 连接